#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=2000010;
int T,n,a[maxn],m,ans1,ans2;
char s[maxn];
bool judge(int index)
{
int have=0,res=0;
for(int i=1;i<=m;i++)
{
if(i<=index && a[i]==1)have++;
else if(have)have--,res++;
}
if(have==0){ans2=max(ans2,res);return 1;}
return 0;
}
int main()
{
T=read();
while(T--)
{
n=read();
m=ans1=ans2=0;
scanf("%s",s);
for(int i=0;i1)
{
int mid=L+R>>1;
if(judge(mid))L=mid;
else R=mid;
}
judge(L);judge(R);
printf("%d\n",ans1+ans2);
}
return 0;
}
#include
#include
#include
#include
#define ll long long
using namespace std;
int read()
{
int k=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) k=k*10+c-'0';return k*f;
}
int n,m,k;
char s[2000005],str[5];
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
m=read();
k=1;
for(int i=1;i<=m;i++)
{
// cout<0)
k=(k+x-1)%n+1;
else
k=(k+n+x-1)%n+1;
}
}
return 0;
}
#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair PDD;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const double eps=1e-10;
struct Point{
double x,y;
Point() {}
Point(double _1,double _2):x(_1),y(_2) {}
Point operator - (const Point&s) const {return Point(x-s.x,y-s.y);}
double operator * (const Point&s) const {return x*s.y-y*s.x;}
double len() {return x*x+y*y;}
}a[50];
typedef Point Vec;
double dis(Point a,Point b){
return (a-b).len();
}
int T;
int main()
{
T=read();
while(T--)
{
int left=0;
for(int i=1;i<=20;i++)scanf("%lf%lf",&a[i].x,&a[i].y),a[i+20]=a[i];
for(int i=1;i<39;i++)
{
if(fabs(dis(a[i],a[i+1])-81.0)0) left=0;
else left=1;
}
else if(fabs(dis(a[i+1],a[i+2])-64.0)0) left=1;
else left=0;
}
break;
}
}
if(left)puts("left");
else puts("right");
}
return 0;
}
#include
#include
#include
#include
#define ll long long
using namespace std;
int read()
{
int k=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) k=k*10+c-'0';return k*f;
}
int T,n,m,ans[105];
void pr(int x)
{
int sum=1;
printf("1 1\n");
if(sum==x) return;
for(int i=2;i<=8;i++)
{
for(int k=1;k<=i-1;k++)
{
sum++;
printf("%d %d\n",i,k);
if(sum==x) return;
}
for(int k=1;k<=i-1;k++)
{
sum++;
printf("%d %d\n",k,i);
if(sum==x) return;
}
sum++;printf("%d %d\n",i,i);
if(sum==x) return;
}
}
int main()
{
int sum=1;ans[1]=4;
for(int i=2;i<=8;i++)
{
for(int k=1;k<=i-1;k++)
{
sum++;
ans[sum]=ans[sum-1]+2*(k==1);
}
for(int k=1;k<=i-1;k++)
{
sum++;
ans[sum]=ans[sum-1]+2*(k==1);
}
sum++;ans[sum]=ans[sum-1];
}
for(T=read();T;T--)
// for(n=1;n<=50;n++)
// for(m=1;m<=200;m++)
{
n=read();m=read();
if(n==1)
{
if(m==4) printf("Yes\n1 1\n");
else printf("No\n");
continue;
}
else
{
if(m&1)
{
puts("No");continue;
}
if(mn*4)
{
puts("No");continue;
}
if(n*4==m)
{
puts("Yes");
for(int i=1;i<=n;i++)
printf("%d %d\n",i,i);
continue;
}
int fl=1;
for(int i=1;i<=n;i++)
{
if(ans[i]+(n-i)*4==m)
{
puts("Yes");
pr(i);
for(int j=1;j<=n-i;j++)
{
printf("%d %d\n",-j,-j);
}
fl=0;
}
else if(ans[i]+(n-i)*4-2==m)
{
puts("Yes");
pr(i);
for(int j=1;j<=n-i-1;j++)
printf("%d %d\n",-j,-j);
puts("0 1");
fl=0;
}
if(!fl) break;
}
}
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair PII;
#define X first
#define Y second
inline int read()
{
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxN=2000000;
int phi[maxN+10],prime[maxN+10],isn[maxN+10],F[maxN+10],len,A;
LL pre[maxN+10];
bool vis[maxN+10];
void init()
{
phi[1]=1;
for(int i=2;i<=maxN;i++)
{
if(!vis[i])prime[++len]=i;
for(int j=1;j<=len;j++)
{
if(i*prime[j]>maxN)break;
vis[i*prime[j]]=1;
isn[i*prime[j]]=prime[j];
if(i%prime[j]==0){
break;
}
}
}
for(int i=2;i<=maxN;i++)
if(vis[i])
{
int tmp=i;
F[i]=1;
while(tmp%isn[i]==0)F[i]*=isn[i],tmp/=isn[i];
}
// for(int i=2;i<=100;i++) printf("%d %d\n",i,F[i]);
}
LL gcd(LL a,LL b){return b==0 ? a : gcd(b,a%b);}
PII exgcd(LL a,LL b)//解出ax+by=gcd(a,b)
{
if(!b){return make_pair(1,0);}
PII tmp=exgcd(b,a%b);
return make_pair(-tmp.Y,-tmp.X-(a/b)*tmp.Y);
}
LL modeq(LL a,LL b)//求解ax=1(mod b)
{
LL x=exgcd(a,b).X;
return (x%b+b)%b;
}
int main()
{
init();
int T=read();
while(T--)
{
LL a=read(),b=read();
if(b==1 || (!vis[b] && a%b!=0)){printf("-1 -1 -1 -1\n");continue;}
else if(!vis[b])
{
printf("%lld 1 1 1\n",a/b+1,1,1,1);
continue;
}
else
{
LL k1=F[b],f=b/F[b];
if(f==1)k1=isn[b],f=b/k1;
LL GCD=gcd(k1,f);
// printf("%lld %lld\n",k1,f);
if(a%GCD!=0)
{
printf("-1 -1 -1 -1\n");
continue;
}
else
{
a/=GCD;k1/=GCD;f/=GCD;
LL e=modeq(k1,f);
e=((e*(f-a))%f+f)%f;
// printf("a:%lld k1:%lld f:%lld %lld\n",a,k1,f,e);
if(!e)e=f;
printf("%lld %lld %lld %lld\n",(a+e*k1)/f,k1*GCD,e,f*GCD);
}
}
}
return 0;
}
===== G.Operating on a Graph =====
=== 题意 ===
给了一个图,每个点最开始属于自己的编号的组,每次指定一个组,把组里所有点所连向的其他组全部改为指定的组,最后输出每个点属于哪个组。
=== 题解 ===
直接用并查集维护组,set记录组里的边,每次合并用启发式合并就可以过掉了
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
int read()
{
int k=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) k=k*10+c-'0';return k*f;
}
const int N=2000055;
typedef pair P;
int T,n,m,q,head[N],nextt[N],to[N],w[N],num[N];
int fa[N],size[N];
set s[N];
P ad[N],now[N];
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
int main()
{
for(T=read();T;T--)
{
n=read();m=read();
for(int i=0;ib) swap(a,b);
s[a].insert(P(a,b));
s[b].insert(P(a,b));
}
q=read();
for(int i=1;i<=q;i++)
{
int x=read();
if(x!=find(x)) continue;
set::iterator it,itt;
int k=num[x];
int cnt=0,tot=0;
for(it=s[k].begin();it!=s[k].end();it++)
now[++tot]=*it;
for(int j=1;j<=tot;j++)
{
k=num[x];
int y;
y=find(now[j].first);
if(y==x) y=find(now[j].second);
if(y==x) continue;
int kk=num[y];
fa[y]=x;
int cnt=0;
if(s[k].size()>s[kk].size())
{
for(itt=s[kk].begin();itt!=s[kk].end();itt++)
{
if(find(itt->first)!=x||find(itt->second)!=x)
ad[++cnt]=*itt;
}
}
else
{
num[x]=kk;
for(itt=s[k].begin();itt!=s[k].end();itt++)
{
if(find(itt->first)!=x||find(itt->second)!=x)
ad[++cnt]=*itt;
}
}
for(int K=1;K<=cnt;K++)
s[num[x]].insert(ad[K]);
}
}
for(int i=0;i