期望:100 + 80 + 75 = 255
实际:0 + 80 + 60 = 140
唉~一天比一天犯的错误智障,感觉noip要凉啊。。。
吓得我赶紧吃几颗药补补脑子。
奶一下大佬:
lgj AK NOIP zbq AK NOIP gxb AK NOIP
mjt AK NOIP zzx AK NOIP wcz AK NOIP
是的,我什么也没写。QwQ(逃~~~~)
唉~数论学的不行啊!!
后来发现我的T1的0分到100分只有一个memset(vis,0,sizeof(vis))的距离。
mdzz vis数组忘了清零了。
/* 最后形成的联通块的数量,就是n,m,k的最大公约数。 这是显然的。 只要确定每一个联通块都被访问过就可以了。 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T; int b,g,t; long long n,m,k; bool vis[20000000]; long long gcd(long long x,long long y){ return x==0?y:gcd(y%x,x); } int main(){ freopen("happy2.in","r",stdin); freopen("happy2.out","w",stdout); scanf("%d",&T); while(T--){ bool f=0; cin>>n>>m>>k; long long G; if(n!=0&&m!=0&&k!=0){ G=gcd(n,gcd(m,k));} else if(k==0&&n!=0&&m!=0){ G=gcd(n,m);} else if(m!=0&&n!=0&&k!=0){ G=gcd(n,k);} else if(n!=0&&k!=0&&m!=0){ G=gcd(k,m);} else if(n!=0&&m==0&&k==0){ G=n;} else if(m!=0&&n==0&&k==0){ G=m;} else if(k!=0&&m==0&&n==0){ G=k;} scanf("%d",&b); for(int i=1;i<=b;i++){ int x;cin>>x;x%=G; vis[x]=1; } scanf("%d",&g); for(int i=1;i<=g;i++){ int x;cin>>x;x%=G; vis[x]=1; } scanf("%d",&t); for(int i=1;i<=t;i++){ int x;cin>>x;x%=G; vis[x]=1; } for(int i=0;i<G;i++) if(!vis[i]){ puts("No");f=1; break; } if(f==0) puts("Yes"); } }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T,n,m,k,b,g,t; int fa[6010],vis[6010]; int idb[100010],idg[100010],idt[100010]; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int gcd(int x,int y){ return x==0?y:gcd(y%x,x); } int find(int x){ if(fa[x]==x) return x; return fa[x]=find(fa[x]); } int main(){ freopen("happy2.in","r",stdin); freopen("happy2bao.out","w",stdout); T=read(); while(T--){ n=read();m=read();k=read(); b=read(); for(int i=1;i<=b;i++) idb[i]=read(); g=read(); for(int i=1;i<=g;i++) idg[i]=read(); t=read(); for(int i=1;i<=t;i++) idt[i]=read(); if(n<=2000){ bool f=0; for(int i=0;i<m+n+k;i++) fa[i]=i; int G,LCM; if(n!=0&&m!=0&&k!=0){ G=gcd(n,gcd(m,k));LCM=n/G*m/G*k; } else if(k==0&&n!=0&&m!=0){ G=gcd(n,m);LCM=n/G*m; } else if(m!=0&&n!=0&&k!=0){ G=gcd(n,k);LCM=n/G*k; } else if(n!=0&&k!=0&&m!=0){ G=gcd(k,m);LCM=k/G*m; } else if(n!=0&&m==0&&k==0){ G=n;LCM=n;} else if(m!=0&&n==0&&k==0){ G=m;LCM=m;} else if(k!=0&&m==0&&n==0){ G=k;LCM=k;} for(int i=0;i<LCM;i++){ int a,b,c,da,db,dc; if(n!=0) a=i%n; if(m!=0) b=i%m+n; if(k!=0) c=i%k+n+m; if(n!=0) da=find(a); if(m!=0) db=find(b); if(n!=0&&m!=0&&da!=db) fa[da]=db; if(m!=0) db=find(b); if(k!=0) dc=find(c); if(m!=0&&k!=0&&db!=dc) fa[db]=dc; if(n!=0) da=find(a); if(k!=0) dc=find(c); if(n!=0&&k!=0&&da!=dc) fa[da]=dc; } for(int i=1;i<=b;i++) vis[find(idb[i])]=1; for(int i=1;i<=g;i++) vis[find(idg[i]+n)]=1; for(int i=1;i<=t;i++) vis[find(idt[i]+n+m)]=1; for(int i=0;i<n+m+k;i++) if(find(i)==i&&vis[i]==0){ puts("No");f=1; break; } if(f==0) puts("Yes"); } } }
/* 最后形成的联通块的数量,就是n,m,k的最大公约数。 这是显然的。 只要确定每一个联通块都被访问过就可以了。 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int T; int b,g,t; long long n,m,k; bool vis[20000000]; long long gcd(long long x,long long y){ return x==0?y:gcd(y%x,x); } int main(){ freopen("happy2.in","r",stdin); freopen("happy2.out","w",stdout); scanf("%d",&T); while(T--){ bool f=0; cin>>n>>m>>k; long long G; if(n!=0&&m!=0&&k!=0){ G=gcd(n,gcd(m,k));} else if(k==0&&n!=0&&m!=0){ G=gcd(n,m);} else if(m!=0&&n!=0&&k!=0){ G=gcd(n,k);} else if(n!=0&&k!=0&&m!=0){ G=gcd(k,m);} else if(n!=0&&m==0&&k==0){ G=n;} else if(m!=0&&n==0&&k==0){ G=m;} else if(k!=0&&m==0&&n==0){ G=k;} scanf("%d",&b); if(n==30&&m==42){ int hh=1; } for(int i=1;i<=b;i++){ int x;cin>>x;x%=G; vis[x]=1; } scanf("%d",&g); for(int i=1;i<=g;i++){ int x;cin>>x;x%=G; vis[x]=1; } scanf("%d",&t); for(int i=1;i<=t;i++){ int x;cin>>x;x%=G; vis[x]=1; } for(int i=0;i<G;i++) if(!vis[i]){ puts("No");f=1; break; } if(f==0) puts("Yes"); memset(vis,0,sizeof(vis)); } }
/* 期望得分:80 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int p; long long n,ans; bool vi[300010]; int yes[300010]; int vis[1010][1010]; struct nond{ int x,y; }v[300010]; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } bool judge(int a,int b){ int sum=yes[a]+yes[b]-vis[a][b]; if(sum>=p) return true; else return false; } int main(){ // freopen("lpp.in","r",stdin); freopen("suspect.in","r",stdin); freopen("suspect.out","w",stdout); cin>>n;p=read(); for(int i=1;i<=n;i++){ v[i].x=read(); v[i].y=read(); if(v[i].x>v[i].y) swap(v[i].x,v[i].y); } if(p==0){ ans=n*(n-1)/2; cout<<ans; } else if(p==1){ long long tot=0; for(int i=1;i<=n;i++){ if(!vi[v[i].x]){ vi[v[i].x]=1;tot++; } if(!vi[v[i].y]){ vi[v[i].y]=1;tot++; } } long long last=n-tot; ans=n*(n-1)/2-last*(last-1)/2; cout<<ans; } else if(n<=1000){ for(int i=1;i<=n;i++){ yes[v[i].x]++; yes[v[i].y]++; vis[v[i].x][v[i].y]++; } for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(judge(i,j)) ans++; cout<<ans; } }
/* 期望得分:75 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int sum[1010][1010]; int sum0[300010],sum1[300010]; int a[300010],b[300010],num[300010]; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int main(){ freopen("xor.in","r",stdin); freopen("xor.out","w",stdout); n=read();int num1=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[i]=a[i]; if(a[i]<=1) num1++; } sort(b+1,b+1+n); int bnum=unique(b+1,b+1+n)-b-1; if(bnum==n){ m=read(); for(int i=1;i<=m;i++){ int l=read();int r=read(); puts("0"); } } else if(num1==n){ for(int i=1;i<=n;i++){ if(a[i]==1){ sum0[i]=sum0[i-1]; sum1[i]=sum1[i-1]+1; } if(a[i]==0){ sum1[i]=sum1[i-1]; sum0[i]=sum0[i-1]+1; } } m=read(); for(int i=1;i<=m;i++){ int l=read();int r=read(); int xx=sum1[r]-sum1[l-1]; int yy=sum0[r]-sum0[l-1]; if(xx%2==0&&yy%2==0&&xx!=0&&yy!=0) puts("1"); else if(xx%2==0&&xx!=0) puts("1"); else if(yy%2==0&&yy!=0) puts("0"); else puts("0");//漏下的情况 } } else if(n<=1000){ for(int i=1;i<=n;i++){ int x=a[i]; a[i]=lower_bound(b+1,b+1+bnum,a[i])-b; num[a[i]]=x; } for(int i=1;i<=n;i++) for(int j=1;j<=bnum;j++){ if(a[i]==j) sum[i][j]=sum[i-1][j]+1; else sum[i][j]=sum[i-1][j]; } m=read(); for(int i=1;i<=m;i++){ int l=read();int r=read(); int ans=0; for(int j=1;j<=bnum;j++){ int xx=sum[r][j]-sum[l-1][j]; if(xx%2==0&&xx!=0) ans=ans^num[j]; } printf("%d\n",ans); } } } /* 7 1 0 0 1 1 0 0 5 4 7 4 5 1 3 1 7 1 5 */