noip模擬37
阿新 • • 發佈:2021-08-13
T1 數列 T2 數對 T3 最小距離 T4真相
和點\(j\),假設\(i\)和\(j\)是由不同的特殊點\(p_i,p_j\)拓展的,若\(p_i\)的最短距離經過了邊\((i,j)\),那麼\(p_i\)的距離最短特殊點一定是\(p_j\)
期望得分:100+10+15+0=125
實際得分:100+10+10+0=120
T1
簽到題,擴歐,然後三分,或者直接\(O(1)\)出解
T2
隊長快跑微弱加強版,區別在於這道題需要排序
發現若\(a_i< b_j\)且\(a_j> b_i\),則\(i\)一定在\(j\)之前,反之則\(i\)在\(j\)之後
剩下的兩種情況怎麼排都相同
想到這裡就是隊長快跑了,,,線段樹優化\(dp\)
然而考場上只打了\(O(2^nn^2n!)\),,,
T3
若沒有終點是特殊點這個限制就是多源最短路,加上限制後考慮怎麼改多源最短路
考慮跑\(dij\)時記錄每個點是由哪個特殊點拓展的
發現對於一條邊兩端的點\(i\)
跑完\(dij\)後列舉每條邊計算答案就行了
T4
如果沒有第一種話,那麼先隨便確定一個人的真假,那麼整個環的真假就確定了,直接判斷是否矛盾
考慮加入第一種話,發現第一種話將環分成若干個不同的序列,同樣的,確定序列中一個人的真假,整個序列就確定了
預處理出每段以說第一種話的人結尾的序列,在這個人分別說真話和假話時序列中說真話人的數量
然後列舉所有第一種話,分別判斷其為真時是否不矛盾
程式碼
T1
#include<bits/stdc++.h> using namespace std; namespace STD { #define rr register typedef long long ll; const ll inf=LONG_LONG_MAX; const int N=1e5+4; int n,a,b; ll ans; int x[N]; int read() { rr int x_read=0,y_read=1; rr char c_read=getchar(); while(c_read<'0'||c_read>'9') { if(c_read=='-') y_read=-1; c_read=getchar(); } while(c_read<='9'&&c_read>='0') { x_read=(x_read<<1)+(x_read<<3)+(c_read^48); c_read=getchar(); } return x_read*y_read; } int exgcd(int a_e,int b_e,ll &x_e,ll &y_e) { if(b_e==0) { x_e=1; y_e=0; return a_e; } int gcd=exgcd(b_e,a_e%b_e,x_e,y_e); int temp=x_e; x_e=y_e; y_e=temp-a_e/b_e*y_e; return gcd; } void deal(int val) { ll p,q; int gcd=exgcd(a,b,p,q); if(val%gcd) { printf("-1\n"); exit(0); } p=val/gcd*p; q=val/gcd*q; int l=0,r=1e9; ll x1,x2,x3; ll temp=inf; while(l<r) { int mid=(l+r)>>1; x1=abs(p-(mid-1)*1ll*(b/gcd))+abs(q+(mid-1)*1ll*(a/gcd)); x2=abs(p-mid*1ll*(b/gcd))+abs(q+mid*1ll*(a/gcd)); x3=abs(p-(mid+1)*1ll*(b/gcd))+abs(q+(mid+1)*1ll*(a/gcd)); if(x1>=x2&&x2<=x3) { ans+=x2; return; } if(x1>x3) l=mid+1; else r=mid; } l=0,r=1e9; while(l<r) { int mid=(l+r)>>1; x1=abs(p+(mid-1)*1ll*(b/gcd))+abs(q-(mid-1)*1ll*(a/gcd)); x2=abs(p+mid*1ll*(b/gcd))+abs(q-mid*1ll*(a/gcd)); x3=abs(p+(mid+1)*1ll*(b/gcd))+abs(q-(mid+1)*1ll*(a/gcd)); if(x1>=x2&&x3>=x2) { ans+=x2; return; } if(x1>x3) l=mid+1; else r=mid; } } }; using namespace STD; int main() { n=read(),a=read(),b=read(); for(rr int i=1;i<=n;i++) x[i]=read(); for(rr int i=1;i<=n;i++) deal(abs(x[i])); printf("%lld\n",ans); }
T2
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1000011; struct tree{ int l,r; int sum; int maxa; int lazy; }tre[6*N]; struct pot_{ int a,b,w; int ab; friend bool operator<(pot_ a,pot_ b) { return a.ab<b.ab; } }pot[N]; int jud[N]; int n; int lsh[N],sl; int f[N]; int maxx; inline int read() { int s=0; char ch=getchar(); while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') { s=(s<<1)+(s<<3)+(ch^48); ch=getchar(); } return s; } void update(int i) { if(tre[i<<1].sum>tre[i<<1|1].sum) { tre[i].sum=tre[i<<1].sum; tre[i].maxa=tre[i<<1].maxa; } else { tre[i].sum=tre[i<<1|1].sum; tre[i].maxa=tre[i<<1|1].maxa; } return; } void build(int i,int l,int r) { tre[i].l=l; tre[i].r=r; if(l==r) { if(jud[l]) tre[i].maxa=l; return; } int mid=(l+r)>>1; build(i<<1,l,mid); build(i<<1|1,mid+1,r); return; } void pushdown(int i) { tre[i<<1].sum+=tre[i].lazy; tre[i<<1|1].sum+=tre[i].lazy; tre[i<<1].lazy+=tre[i].lazy; tre[i<<1|1].lazy+=tre[i].lazy; tre[i].lazy=0; return; } void insert(int i,int x,int val) { if(tre[i].lazy) pushdown(i); if(tre[i].l==tre[i].r) { tre[i].sum=max(val,tre[i].sum); return; } int mid=(tre[i].l+tre[i].r)>>1; if(mid>=x) insert(i<<1,x,val); else insert(i<<1|1,x,val); update(i); return; } void insert1(int i,int l,int r,int val) { if(tre[i].lazy) pushdown(i); if(tre[i].l>=l&&tre[i].r<=r) { tre[i].sum+=val; tre[i].lazy+=val; return; } int mid=(tre[i].l+tre[i].r)>>1; if(mid>=l) insert1(i<<1,l,r,val); if(mid<r) insert1(i<<1|1,l,r,val); update(i); return; } tree query(int i,int l,int r) { if(tre[i].lazy) pushdown(i); if(tre[i].l>=l&&tre[i].r<=r) return tre[i]; tree ans1,ans2; ans1.sum=ans1.maxa=ans2.sum=ans2.maxa=0; int mid=(tre[i].l+tre[i].r)>>1; if(mid>=l) ans1=query(i<<1,l,r); if(mid<r) ans2=query(i<<1|1,l,r); return ans1.sum<ans2.sum?ans2:ans1; } void lsh_() { sort(lsh+1,lsh+sl+1); int x=unique(lsh+1,lsh+sl+1)-lsh; for(int i=1;i<=n;i++) { pot[i].a=lower_bound(lsh+1,lsh+x,pot[i].a)-lsh; pot[i].b=lower_bound(lsh+1,lsh+x,pot[i].b)-lsh; pot[i].ab=pot[i].a+pot[i].b; jud[pot[i].a]=1; maxx=max(maxx,max(pot[i].a,pot[i].b)); } return; } signed main() { n=read(); for(int i=1;i<=n;i++) { lsh[++sl]=pot[i].a=read(); lsh[++sl]=pot[i].b=read(); pot[i].w=read(); } lsh_(); sort(pot+1,pot+n+1); build(1,1,maxx); maxx=0; for(int i=1;i<=n;i++) { if(pot[i].a<pot[i].b) { tree ans=query(1,1,pot[i].a); ans.sum+=pot[i].w; f[i]=ans.sum; insert(1,pot[i].a,ans.sum); ans=query(1,pot[i].a+1,pot[i].b); ans.sum+=pot[i].w; f[i]=max(f[i],ans.sum); insert1(1,pot[i].a+1,pot[i].b,pot[i].w); } else { tree ans=query(1,1,pot[i].b); ans.sum+=pot[i].w; insert(1,pot[i].a,ans.sum); f[i]=ans.sum; } maxx=max(maxx,f[i]); } cout<<maxx<<endl; return 0; }
T3
#include<bits/stdc++.h>
using namespace std;
const int N=200011;
struct tu{
int x;
long long d;
friend bool operator<(tu a,tu b)
{
return a.d>b.d;
}
}a,b;
struct qxxx{
int v,next;
long long w;
}cc[2*N];
bool jud[N];
int p[N];
int first[N],cnt;
int fm[N];
int n,m,num;
long long d[N];
long long ans[N];
priority_queue<tu> dui;
inline int read()
{
int s=0;
char ch=getchar();
while(ch>'9'||ch<'0')
ch=getchar();
while(ch>='0'&&ch<='9')
{
s=(s<<1)+(s<<3)+(ch^48);
ch=getchar();
}
return s;
}
void qxx(int u,int v,int w)
{
cc[++cnt].v=v;
cc[cnt].w=w;
cc[cnt].next=first[u];
first[u]=cnt;
return;
}
inline long long min_(long long a,long long b)
{
return a<b?a:b;
}
void dij()
{
memset(d,0x7f,sizeof(d));
for(int i=1;i<=num;i++)
{
a.x=p[i];
d[a.x]=0;
dui.push(a);
fm[a.x]=p[i];
}
while(dui.size())
{
a=dui.top();
dui.pop();
if(jud[a.x])
continue;
jud[a.x]=1;
for(int i=first[a.x];i;i=cc[i].next)
if(d[cc[i].v]>d[a.x]+cc[i].w)
{
d[cc[i].v]=d[a.x]+cc[i].w;
fm[cc[i].v]=fm[a.x];
b.x=cc[i].v;
b.d=d[cc[i].v];
dui.push(b);
}
}
return;
}
signed main()
{
int x,y,z;
n=read();
m=read();
num=read();
for(int i=1;i<=num;i++)
p[i]=read();
for(int i=1;i<=m;i++)
{
x=read();
y=read();
z=read();
qxx(x,y,z);
qxx(y,x,z);
}
dij();
memset(ans,0x7f,sizeof(ans));
for(int i=1;i<=n;i++)
for(int j=first[i];j;j=cc[j].next)
if(fm[i]!=fm[cc[j].v])
{
x=fm[i],y=fm[cc[j].v];
long long k=d[cc[j].v]+cc[j].w+d[i];
ans[x]=min_(ans[x],k);
ans[y]=min_(ans[y],k);
}
for(int i=1;i<=num;i++)
printf("%lld ",ans[p[i]]);
return 0;
}
T4
#include<bits/stdc++.h>
using namespace std;
const int N=100011;
struct wd{
int sl;
char kd;
}pot[N];
struct ary{
int l,r;
int num[2];
}ary[N];
bool jud[N];
int jud1[N][2];
int n;
int sum;
int wzq,wz,sl;
vector<int> vct;
inline int read()
{
int s=0;
char ch=getchar();
while(ch>'9'||ch<'0')
ch=getchar();
while(ch>='0'&&ch<='9')
{
s=(s<<1)+(s<<3)+(ch^48);
ch=getchar();
}
return s;
}
inline char readc()
{
char ch=getchar();
while(ch!='+'&&ch!='-'&&ch!='$')
ch=getchar();
return ch;
}
void solve(int x)
{
ary[x].num[0]=0;
for(int i=ary[x].r-1;i>=ary[x].l;i--)
{
if((jud[i+1]&&pot[i].kd=='+')||(!jud[i+1]&&pot[i].kd=='-'))
jud[i]=1,ary[x].num[0]++;
else
jud[i]=0;
}
ary[x].num[1]=1;
jud[ary[x].r]=1;
for(int i=ary[x].r-1;i>=ary[x].l;i--)
{
if((jud[i+1]&&pot[i].kd=='+')||(!jud[i+1]&&pot[i].kd=='-'))
jud[i]=1,ary[x].num[1]++;
else
jud[i]=0;
}
if(!jud1[pot[ary[x].r].sl][0])
{
jud1[pot[ary[x].r].sl][0]=1;
jud1[pot[ary[x].r].sl][1]+=ary[x].num[1]-ary[x].num[0];
vct.push_back(pot[ary[x].r].sl);
}
else
jud1[pot[ary[x].r].sl][1]+=ary[x].num[1]-ary[x].num[0];
sum+=ary[x].num[0];
return;
}
void init()
{
memset(jud,0,sizeof(jud));
memset(jud1,0,sizeof(jud1));
if(vct.size())
vct.clear();
sum=0;
sl=0;
return;
}
int main()
{
int t=read();
while(t--)
{
init();
n=read();
int num=0;
for(int i=1;i<=n;i++)
{
pot[i].kd=readc();
if(pot[i].kd=='$')
{
num++;
pot[i].sl=read();
}
}
if(!num)
{
bool jd=0;
jud[1]=1;
for(int i=1;i<n;i++)
{
if(jud[i]==1&&pot[i].kd=='+')
jud[i+1]=1;
else if(!jud[i]&&pot[i].kd=='+')
jud[i+1]=0;
else if(jud[i]&&pot[i].kd=='-')
jud[i+1]=0;
else
jud[i+1]=1;
}
if(jud[n]==1&&pot[n].kd=='+'||jud[n]==0&&pot[n].kd=='-')
jd=1;
else
jd=0;
if(!jd)
{
jud[1]=0;
for(int i=1;i<n;i++)
{
if(jud[i]==1&&pot[i].kd=='+')
jud[i+1]=1;
else if(!jud[i]&&pot[i].kd=='+')
jud[i+1]=0;
else if(!jud[i]&&pot[i].kd=='-')
jud[i+1]=1;
else
jud[i+1]=0;
}
if(!jud[n]&&pot[n].kd=='+'||jud[n]&&pot[n].kd=='-')
jd=1;
else
jd=0;
}
if(jd)
printf("%s\n","consistent");
else
printf("%s\n","inconsistent");
}
else
{
for(int i=1;i<=n;i++)
if(pot[i].kd=='$')
{
wzq=i;
break;
}
memcpy(pot+n+1,pot+1,sizeof(wd)*wzq);
wz=n+wzq;
int qd=wzq+1;
for(int i=wzq+1;i<=wz;i++)
if(pot[i].kd=='$')
{
ary[++sl].l=qd;
ary[sl].r=i;
qd=i+1;
}
for(int i=1;i<=sl;i++)
solve(i);
bool jd=0;
for(int i=0;i<vct.size();i++)
if(vct[i]==sum+jud1[vct[i]][1])
{
jd=1;
break;
}
bool jd1=1;
for(int i=0;i<vct.size();i++)
if(vct[i]==sum)
jd1=0;
if(jd||jd1)
printf("%s\n","consistent");
else
printf("%s\n","inconsistent");
}
}
return 0;
}