------------恢复内容开始------------

9.12

​Gym102452D​​  Defining Labels

题意:输出k进制下,第n小的数字

思路:按照幂次减去,得到相应的位数和剩余的x,然后再去构造题意:求L->R之间 求 x和f(x) 同余m的数字有多少个,f(x)为一个数的每一位两两相乘的和

思路:很明显是一道数位dp,我一开始想的是维护三个变量,前缀和、数字的余、f(x) 但是这样子空间会爆

然后维护一个前缀和、(x-f(x)) mod m,加上数位dp就可以,加上一些细节的处理,很奇怪的就是直接维护xmodm的值两个相减是错的

然后string要用传地址,改成数组去进行计算,会更加的快


日常_#define日常_#include_02


#include<bits/stdc++.h>
#include<cctype>
using namespace std;
typedef long long ll;typedef double db;
typedef pair<int, int> pii;typedef pair<ll, ll> pll;
typedef pair<int,ll> pil;typedef pair<ll,int> pli;
#define Fi first
#define Se second
#define _Out(a) cerr<<#a<<" = "<<(a)<<endl
const int INF = 0x3f3f3f3f, MAXN = 5e5 + 5;
const ll LINF = 0x3f3f3f3f3f3f3f3f, MOD = 998244353;
const db Pi = acos(-1), EPS = 1e-6;
void test(){cerr << "\n";}template<typename T,typename...Args>void test(T x,Args...args){cerr<<x<<" ";test(args...);}
inline ll qpow(ll a, ll b){return b?((b&1)?a*qpow(a*a%MOD,b>>1)%MOD:qpow(a*a%MOD,b>>1))%MOD:1;}
inline ll qpow(ll a, ll b,ll c){return b?((b&1)?a*qpow(a*a%c,b>>1,c)%c:qpow(a*a%c,b>>1,c)) %c:1;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a*b/gcd(a,b);}
inline ll cede(ll a,ll b){if(b<0)return cede(-a,-b);if(a<0)return a/b;return (a+b-1)/b;}
inline ll flde(ll a,ll b){if(b<0)return flde(-a,-b);if(a<0)return (a-b+1)/b;return a/b;}
inline int sign(db x){return x<-EPS ? -1:x>EPS;}
inline int dbcmp(db l,db r){return sign(l - r);}
namespace Fast_IO{ //orz laofu
const int MAXL((1 << 18) + 1);int iof, iotp;
char ioif[MAXL], *ioiS, *ioiT, ioof[MAXL],*iooS=ioof,*iooT=ioof+MAXL-1,ioc,iost[55];
char Getchar(){
if (ioiS == ioiT){
ioiS=ioif;ioiT=ioiS+fread(ioif,1,MAXL,stdin);return (ioiS == ioiT ? EOF : *ioiS++);
}else return (*ioiS++);
}
void Write(){fwrite(ioof,1,iooS-ioof,stdout);iooS=ioof;}
void Putchar(char x){*iooS++ = x;if (iooS == iooT)Write();}
inline int rd(){
int x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
inline long long read_ll(){
long long x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
void Getstr(char *s, int &l){// isgraph || isalnum || iscntrl || isblank
for(ioc=Getchar();ioc!=EOF&&!isgraph(ioc);)ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(l=0;isgraph(ioc);ioc=Getchar())s[l++]=ioc;s[l] = 0;
}
template <class Int>void Print(Int x, char ch = '\0'){
if(!x)Putchar('0');if(x<0)Putchar('-'),x=-x;while(x)iost[++iotp]=x%10+'0',x/=10;
while(iotp)Putchar(iost[iotp--]);if (ch)Putchar(ch);
}
void Putstr(const char *s){for(int i=0;s[i];++i)Putchar(s[i]);}
} // namespace Fast_IO
using namespace Fast_IO;

//#define int long long
const int mod=1e9+7;
int dp[5005][61][61],p[5005];
inline int dfs(int pos,int lim,int sum1,int cha,string &s,int m)
{
//cout<<pos<<'\n';
if(pos==-1) return cha==0;
// int tmp=(((sum1-sum3)%m+m)%m);
if(!lim&&dp[pos][sum1][cha]!=-1) return dp[pos][sum1][cha];
int up=lim?s[pos]-'0':9;
ll ans=0;
for(int i=0;i<=up;++i)
{
//ans=(ans+dfs(pos-1,lim&&i==up,(sum1*10+i)%m,(sum2+i)%m,(sum3+sum2*i)%m,s)%mod+mod)%mod;
ans=(ans+dfs(pos-1,lim&&i==up,(sum1+i)%m,((cha+i*sum1-p[pos]*i)%m+m)%m,s,m)%mod)%mod;
}
if(!lim) dp[pos][sum1][cha]=ans;
return ans;
}
inline int check(string &s,int m)
{
int sum1=0,sum2=0,sum3=0;
for(int i=s.size()-1;i>=0;--i)
{
int tmp=s[i]-'0';
sum1=(sum1*10+tmp)%m;sum3=(sum3+sum2*tmp)%m;sum2=(sum2+tmp)%m;
}
return sum1==sum3;
}
struct query
{
string l,r;
}qq[100050];
vector<int>v[62];
int ans[100050],maxx[62];
void run()
{
int _;cin>>_;
for(int i=1;i<=_;++i)
{
string s1,s2;int m;cin>>qq[i].l>>qq[i].r>>m;
v[m].push_back(i);
maxx[m]=max(maxx[m],(int)qq[i].r.size());
}
for(int i=2;i<=60;++i)
{
if(v[i].size()==0) continue;
p[0]=1;
for(int j=1;j<=maxx[i];++j) p[j]=p[j-1]*10%i;
memset(dp,-1,sizeof dp);
for(auto x:v[i])
{
reverse(qq[x].r.begin(),qq[x].r.end());reverse(qq[x].l.begin(),qq[x].l.end());
ans[x]=((dfs(qq[x].r.size()-1,1,0,0,qq[x].r,i)-dfs(qq[x].l.size()-1,1,0,0,qq[x].l,i)+check(qq[x].l,i))%mod+mod)%mod;
}
}
for(int i=1;i<=_;++i) cout<<ans[i]<<'\n';

}
/*
1
3893
6798
7
*/
signed main()
{
ios::sync_with_stdio(false),cin.tie(nullptr);
//int _;cin>>_;
// while(_--)
run();
return 0;
}

View Code

 

9.13

​Gym102452E​​ Erasing Numbers (好题)

题意:给你n个数,每次选连续三个数消去最大和最小的,问最后可能剩余的情况

思路:当n<=1e4时候,直接去N^2的做,思路就是枚举每一位数字,比他小的为0,比他大的为1,然后遍历一遍是看0多还是1多,

如果0多那么就就去消去多余的0,每三个0就能消去一个0,一个0可以和一个1相互消掉,过程中是否有一刻0的个数等于1的个数这样子就可以了。

当 n>=1e5时,就要去换一种做法,要采用nlogn的做法,去用线段树去维护,通过维护ret和num(ret是表示能消掉多少个,num表示还剩余多少个),

可以发现他们的第二维都是不会超过3的,按照和上面一样的思想,0和1分别的分开做,看是否可以。

 

n<=1e4


日常_#define日常_#include_02


#include<bits/stdc++.h>
#include<cctype>
using namespace std;
typedef long long ll;typedef double db;
typedef pair<int, int> pii;typedef pair<ll, ll> pll;
typedef pair<int,ll> pil;typedef pair<ll,int> pli;
#define Fi first
#define Se second
#define _Out(a) cerr<<#a<<" = "<<(a)<<endl
const int INF = 0x3f3f3f3f, MAXN = 5e5 + 5;
const ll LINF = 0x3f3f3f3f3f3f3f3f, MOD = 998244353;
const db Pi = acos(-1), EPS = 1e-6;
void test(){cerr << "\n";}template<typename T,typename...Args>void test(T x,Args...args){cerr<<x<<" ";test(args...);}
inline ll qpow(ll a, ll b){return b?((b&1)?a*qpow(a*a%MOD,b>>1)%MOD:qpow(a*a%MOD,b>>1))%MOD:1;}
inline ll qpow(ll a, ll b,ll c){return b?((b&1)?a*qpow(a*a%c,b>>1,c)%c:qpow(a*a%c,b>>1,c)) %c:1;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a*b/gcd(a,b);}
inline ll cede(ll a,ll b){if(b<0)return cede(-a,-b);if(a<0)return a/b;return (a+b-1)/b;}
inline ll flde(ll a,ll b){if(b<0)return flde(-a,-b);if(a<0)return (a-b+1)/b;return a/b;}
inline int sign(db x){return x<-EPS ? -1:x>EPS;}
inline int dbcmp(db l,db r){return sign(l - r);}
namespace Fast_IO{
const int MAXL((1 << 18) + 1);int iof, iotp;
char ioif[MAXL], *ioiS, *ioiT, ioof[MAXL],*iooS=ioof,*iooT=ioof+MAXL-1,ioc,iost[55];
char Getchar(){
if (ioiS == ioiT){
ioiS=ioif;ioiT=ioiS+fread(ioif,1,MAXL,stdin);return (ioiS == ioiT ? EOF : *ioiS++);
}else return (*ioiS++);
}
void Write(){fwrite(ioof,1,iooS-ioof,stdout);iooS=ioof;}
void Putchar(char x){*iooS++ = x;if (iooS == iooT)Write();}
inline int rd(){
int x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
inline long long read_ll(){
long long x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
void Getstr(char *s, int &l){// isgraph || isalnum || iscntrl || isblank
for(ioc=Getchar();ioc!=EOF&&!isgraph(ioc);)ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(l=0;isgraph(ioc);ioc=Getchar())s[l++]=ioc;s[l] = 0;
}
template <class Int>void Print(Int x, char ch = '\0'){
if(!x)Putchar('0');if(x<0)Putchar('-'),x=-x;while(x)iost[++iotp]=x%10+'0',x/=10;
while(iotp)Putchar(iost[iotp--]);if (ch)Putchar(ch);
}
void Putstr(const char *s){for(int i=0;s[i];++i)Putchar(s[i]);}
}
using namespace Fast_IO;
const int maxn=5e3+50;
int a[maxn],b[maxn],n;
inline int check(int pos)
{
int ret=0,sum=0;
for(int i=1;i<=n;++i)
{
if(i==pos) continue;
if(a[i]>a[pos]) b[i]=1,ret++;
else b[i]=0,ret--;
}
if(ret==0) return 1;
if(ret>0)
{
for(int i=1;i<=pos-1;++i)
{
if(b[i]) sum++;
else sum--;
if(sum<0) sum=0;
else if(sum>=3) sum=1,ret-=2;
if(ret==0) return 1;
}
sum=0;
for(int i=pos+1;i<=n;++i)
{
if(b[i]) sum++;
else sum--;
if(sum<0) sum=0;
else if(sum>=3) sum=1,ret-=2;
if(ret==0) return 1;

}

}
else
{
for(int i=1;i<=pos-1;++i)
{
if(!b[i]) sum++;
else sum--;
if(sum<0) sum=0;
else if(sum>=3) sum=1,ret+=2;
if(ret==0) return 1;
}
sum=0;
for(int i=pos+1;i<=n;++i)
{
if(!b[i]) sum++;
else sum--;
if(sum<0) sum=0;
else if(sum>=3) sum=1,ret+=2;
if(ret==0) return 1;

}

}
return 0;
}
void run()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i)
{
cout<<check(i)?"1":"0";
}
cout<<'\n';
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(nullptr);
int _;cin>>_;
while(_--)
run();
return 0;
}

View Code

n>1e5


日常_#define日常_#include_02


#include<bits/stdc++.h>
#include<cctype>
using namespace std;
typedef long long ll;typedef double db;
typedef pair<int, int> pii;typedef pair<ll, ll> pll;
typedef pair<int,ll> pil;typedef pair<ll,int> pli;
#define Fi first
#define Se second
#define _Out(a) cerr<<#a<<" = "<<(a)<<endl
const int INF = 0x3f3f3f3f, MAXN = 5e5 + 5;
const ll LINF = 0x3f3f3f3f3f3f3f3f, MOD = 998244353;
const db Pi = acos(-1), EPS = 1e-6;
void test(){cerr << "\n";}template<typename T,typename...Args>void test(T x,Args...args){cerr<<x<<" ";test(args...);}
inline ll qpow(ll a, ll b){return b?((b&1)?a*qpow(a*a%MOD,b>>1)%MOD:qpow(a*a%MOD,b>>1))%MOD:1;}
inline ll qpow(ll a, ll b,ll c){return b?((b&1)?a*qpow(a*a%c,b>>1,c)%c:qpow(a*a%c,b>>1,c)) %c:1;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a*b/gcd(a,b);}
inline ll cede(ll a,ll b){if(b<0)return cede(-a,-b);if(a<0)return a/b;return (a+b-1)/b;}
inline ll flde(ll a,ll b){if(b<0)return flde(-a,-b);if(a<0)return (a-b+1)/b;return a/b;}
inline int sign(db x){return x<-EPS ? -1:x>EPS;}
inline int dbcmp(db l,db r){return sign(l - r);}
namespace Fast_IO{
const int MAXL((1 << 18) + 1);int iof, iotp;
char ioif[MAXL], *ioiS, *ioiT, ioof[MAXL],*iooS=ioof,*iooT=ioof+MAXL-1,ioc,iost[55];
char Getchar(){
if (ioiS == ioiT){
ioiS=ioif;ioiT=ioiS+fread(ioif,1,MAXL,stdin);return (ioiS == ioiT ? EOF : *ioiS++);
}else return (*ioiS++);
}
void Write(){fwrite(ioof,1,iooS-ioof,stdout);iooS=ioof;}
void Putchar(char x){*iooS++ = x;if (iooS == iooT)Write();}
inline int rd(){
int x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
inline long long read_ll(){
long long x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
void Getstr(char *s, int &l){// isgraph || isalnum || iscntrl || isblank
for(ioc=Getchar();ioc!=EOF&&!isgraph(ioc);)ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(l=0;isgraph(ioc);ioc=Getchar())s[l++]=ioc;s[l] = 0;
}
template <class Int>void Print(Int x, char ch = '\0'){
if(!x)Putchar('0');if(x<0)Putchar('-'),x=-x;while(x)iost[++iotp]=x%10+'0',x/=10;
while(iotp)Putchar(iost[iotp--]);if (ch)Putchar(ch);
}
void Putstr(const char *s){for(int i=0;s[i];++i)Putchar(s[i]);}
}
using namespace Fast_IO;
const int maxn=5e3+50;
int num[maxn<<2][4],res[maxn<<2][4];//num表示i为根,从左边j个1消掉3次数,res表示最后剩余1的个数
int a[maxn],p[maxn],ans,rson,q[maxn];
void pushup(int rt)
{
for(int i=0;i<3;++i)
{
num[rt][i]=num[rt<<1][i]+num[rt<<1|1][res[rt<<1][i]];
res[rt][i]=res[rt<<1|1][res[rt<<1][i]];
}
}
void build(int rt,int l,int r)
{
if(l==r)
{
for(int i=0;i<3;++i) num[rt][i]=i>=2,res[rt][i]=i%2+1;
return ;
}
int mid=l+r>>1;
build(rt<<1,l,mid),build(rt<<1|1,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int pos)
{
if(l==r)
{
for(int i=0;i<3;++i) num[rt][i]=0,res[rt][i]=i-1;
res[rt][0]=0;
return ;
}
int mid=l+r>>1;
if(pos<=mid) update(rt<<1,l,mid,pos);
else update(rt<<1|1,mid+1,r,pos);
pushup(rt);
}
void ask(int rt,int l,int r,int L,int R)
{
if(l>=L&&r<=R)
{
ans+=num[rt][rson];
rson=res[rt][rson];
return ;
}
int mid=l+r>>1;
if(L<=mid) ask(rt<<1,l,mid,L,R);
if(R>mid) ask(rt<<1|1,mid+1,r,L,R);
}
void run()
{
int n;cin>>n;
for(int i=1;i<=n;++i) cin>>a[i],p[a[i]]=i;
int mid=(n+1)/2;
q[p[mid]]=1;
build(1,1,n);
for(int i=1;i<mid;++i)
{
int L=1,R=p[i]-1;rson=0,ans=0;
update(1,1,n,p[i]);
if(L<=R) ask(1,1,n,L,R);
rson=0;
L=p[i]+1,R=n;
if(L<=R) ask(1,1,n,L,R);

if(ans*2+i-1>=n-i) q[p[i]]=1;
else q[p[i]]=0;
}
build(1,1,n);
for(int i=n;i>mid;--i)
{
int L=1,R=p[i]-1;rson=0,ans=0;
update(1,1,n,p[i]);
if(L<=R) ask(1,1,n,L,R);
rson=0;
L=p[i]+1,R=n;
if(L<=R) ask(1,1,n,L,R);
if(ans*2+n-i>=i-1) q[p[i]]=1;
else q[p[i]]=0;
}
for(int i=1;i<=n;++i) cout<<q[i];cout<<'\n';
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(nullptr);
int _;cin>>_;
while(_--)
run();
return 0;
}

View Code

 

9.14

​Gym102452I​​ Incoming Asteroids

题意:给你n个点,1:有k个点的和大于y  2:在x点加上y 第一次满足的时候输出问题的序号,之后就不再输出

思路:想法非常的巧妙,因为k最多只有3,一开始把他们平分,当其中有一个满足时候,更新剩余,这样子一个问题最多被操作logn次,这样子复杂度就是o(n*log2 n)


日常_#define日常_#include_02


#include<bits/stdc++.h>
#include<cctype>
using namespace std;
typedef long long ll;typedef double db;
typedef pair<int, int> pii;typedef pair<ll, ll> pll;
typedef pair<int,ll> pil;typedef pair<ll,int> pli;
#define Fi first
#define Se second
#define _Out(a) cerr<<#a<<" = "<<(a)<<endl
const int INF = 0x3f3f3f3f, MAXN = 5e5 + 5;
const ll LINF = 0x3f3f3f3f3f3f3f3f, MOD = 998244353;
const db Pi = acos(-1), EPS = 1e-6;
void test(){cerr << "\n";}template<typename T,typename...Args>void test(T x,Args...args){cerr<<x<<" ";test(args...);}
inline ll qpow(ll a, ll b){return b?((b&1)?a*qpow(a*a%MOD,b>>1)%MOD:qpow(a*a%MOD,b>>1))%MOD:1;}
inline ll qpow(ll a, ll b,ll c){return b?((b&1)?a*qpow(a*a%c,b>>1,c)%c:qpow(a*a%c,b>>1,c)) %c:1;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a*b/gcd(a,b);}
inline ll cede(ll a,ll b){if(b<0)return cede(-a,-b);if(a<0)return a/b;return (a+b-1)/b;}
inline ll flde(ll a,ll b){if(b<0)return flde(-a,-b);if(a<0)return (a-b+1)/b;return a/b;}
inline int sign(db x){return x<-EPS ? -1:x>EPS;}
inline int dbcmp(db l,db r){return sign(l - r);}
namespace Fast_IO{
const int MAXL((1 << 18) + 1);int iof, iotp;
char ioif[MAXL], *ioiS, *ioiT, ioof[MAXL],*iooS=ioof,*iooT=ioof+MAXL-1,ioc,iost[55];
char Getchar(){
if (ioiS == ioiT){
ioiS=ioif;ioiT=ioiS+fread(ioif,1,MAXL,stdin);return (ioiS == ioiT ? EOF : *ioiS++);
}else return (*ioiS++);
}
void Write(){fwrite(ioof,1,iooS-ioof,stdout);iooS=ioof;}
void Putchar(char x){*iooS++ = x;if (iooS == iooT)Write();}
inline int rd(){
int x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
inline long long read_ll(){
long long x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
void Getstr(char *s, int &l){// isgraph || isalnum || iscntrl || isblank
for(ioc=Getchar();ioc!=EOF&&!isgraph(ioc);)ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(l=0;isgraph(ioc);ioc=Getchar())s[l++]=ioc;s[l] = 0;
}
template <class Int>void Print(Int x, char ch = '\0'){
if(!x)Putchar('0');if(x<0)Putchar('-'),x=-x;while(x)iost[++iotp]=x%10+'0',x/=10;
while(iotp)Putchar(iost[iotp--]);if (ch)Putchar(ch);
}
void Putstr(const char *s){for(int i=0;s[i];++i)Putchar(s[i]);}
}
using namespace Fast_IO;
typedef long long ll;
#define int long long
const int maxn=2e5+50;

priority_queue<pll,vector<pll>,greater<pll> >q[maxn];
struct query
{
int y,k,x[4];//y剩余多少
}qq[maxn];
int a[maxn];//当前每个站有多少
vector<int>work(int x)
{
vector<int>ans;
//cout<<x<<'\n';
while(q[x].size()&&q[x].top().first<=a[x])
{
// cout<<1<<'\n';
auto now=q[x].top();q[x].pop();
int id=now.second;
if(qq[id].y<=0) continue;
ll tmp=qq[id].y;
for(int i=0;i<qq[id].k;++i) tmp-=a[qq[id].x[i]];
//cout<<qq[id].y<<'\n';
if(tmp<=0) ans.push_back(id),qq[id].y=0;
else
{
int v=ceil(1.0*tmp/qq[id].k);
for(int i=0;i<qq[id].k;++i)
{
q[qq[id].x[i]].push({a[qq[id].x[i]]+v,id});
}
}
}
return ans;
}
void run()
{
int n,m;cin>>n>>m;
int last=0,num=0;
while(m--)
{
int op;cin>>op;
if(op==1)
{
++num;
cin>>qq[num].y>>qq[num].k; qq[num].y^=last;
int v=ceil(1.0*qq[num].y/qq[num].k);
for(int i=0;i<qq[num].k;++i)
{
cin>>qq[num].x[i];qq[num].x[i]^=last;
qq[num].y+=a[qq[num].x[i]];
q[qq[num].x[i]].push({v+a[qq[num].x[i]],num});
}
}
else
{
int x,y;cin>>x>>y;x^=last,y^=last;
a[x]+=y;
vector<int>ans=work(x);
sort(ans.begin(),ans.end());
last=ans.size();
cout<<ans.size();for(auto x:ans) cout<<' '<<x;cout<<'\n';
}
}
}
/*

*/
signed main()
{
ios::sync_with_stdio(false),cin.tie(nullptr);
//int _;cin>>_;
// while(_--)
run();
return 0;
}

View Code

 

9.15

​Gym102920G​​ Mobile Robot

题意:给一个数列a,是最后构成一个以d为差的等差数列,问这些数加减最大值的最小值

思路:思维题,一开始以为是三分,但是1e18的常数实在是太大了,导致T,实则就是固定住第一个的位置,然后算出他们的绝对的大小,减去他们的相对大小,除以2就可以得到答案,复杂度O(n) 

还要注意有精度问题所以直接判断,然后输出。


日常_#define日常_#include_02


#include<bits/stdc++.h>
#include<cctype>
using namespace std;
typedef long long ll;typedef double db;
typedef pair<int, int> pii;typedef pair<ll, ll> pll;
typedef pair<int,ll> pil;typedef pair<ll,int> pli;
#define Fi first
#define Se second
#define _Out(a) cerr<<#a<<" = "<<(a)<<endl
const int INF = 0x3f3f3f3f, MAXN = 5e5 + 5;
const ll LINF = 0x3f3f3f3f3f3f3f3f, MOD = 998244353;
const db Pi = acos(-1), EPS = 1e-6;
void test(){cerr << "\n";}template<typename T,typename...Args>void test(T x,Args...args){cerr<<x<<" ";test(args...);}
inline ll qpow(ll a, ll b){return b?((b&1)?a*qpow(a*a%MOD,b>>1)%MOD:qpow(a*a%MOD,b>>1))%MOD:1;}
inline ll qpow(ll a, ll b,ll c){return b?((b&1)?a*qpow(a*a%c,b>>1,c)%c:qpow(a*a%c,b>>1,c)) %c:1;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a*b/gcd(a,b);}
inline ll cede(ll a,ll b){if(b<0)return cede(-a,-b);if(a<0)return a/b;return (a+b-1)/b;}
inline ll flde(ll a,ll b){if(b<0)return flde(-a,-b);if(a<0)return (a-b+1)/b;return a/b;}
inline int sign(db x){return x<-EPS ? -1:x>EPS;}
inline int dbcmp(db l,db r){return sign(l - r);}
namespace Fast_IO{
const int MAXL((1 << 18) + 1);int iof, iotp;
char ioif[MAXL], *ioiS, *ioiT, ioof[MAXL],*iooS=ioof,*iooT=ioof+MAXL-1,ioc,iost[55];
char Getchar(){
if (ioiS == ioiT){
ioiS=ioif;ioiT=ioiS+fread(ioif,1,MAXL,stdin);return (ioiS == ioiT ? EOF : *ioiS++);
}else return (*ioiS++);
}
void Write(){fwrite(ioof,1,iooS-ioof,stdout);iooS=ioof;}
void Putchar(char x){*iooS++ = x;if (iooS == iooT)Write();}
inline int rd(){
int x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
inline long long read_ll(){
long long x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
void Getstr(char *s, int &l){// isgraph || isalnum || iscntrl || isblank
for(ioc=Getchar();ioc!=EOF&&!isgraph(ioc);)ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(l=0;isgraph(ioc);ioc=Getchar())s[l++]=ioc;s[l] = 0;
}
template <class Int>void Print(Int x, char ch = '\0'){
if(!x)Putchar('0');if(x<0)Putchar('-'),x=-x;while(x)iost[++iotp]=x%10+'0',x/=10;
while(iotp)Putchar(iost[iotp--]);if (ch)Putchar(ch);
}
void Putstr(const char *s){for(int i=0;s[i];++i)Putchar(s[i]);}
}
using namespace Fast_IO;
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int maxn=1e6+50;
ll n,d,a[maxn];
ll check(ll x)
{
ll maxx=-inf,minn=inf,st=x;
for(int i=1;i<=n;++i)
{
maxx=max(maxx,a[i]-st);
minn=min(minn,a[i]-st);
st+=d;
}
return maxx-minn;
}
ll check1(ll x)
{
ll maxx=-inf,minn=inf,st=x;
for(int i=1;i<=n;++i)
{
maxx=max(maxx,a[i]-st);
minn=min(minn,a[i]-st);
st-=d;
}
return maxx-minn;
}
void run()
{
cin>>n>>d;
for(int i=1;i<=n;++i) cin>>a[i];
ll ans=min(check(a[1]),check1(a[1]));
if(ans%2==0) cout<<ans/2<<".0"<<'\n';
else cout<<ans/2<<".5"<<'\n';
}
/*

*/
signed main()
{
ios::sync_with_stdio(false),cin.tie(nullptr);
// clock_t c1 = clock();
//int _;cin>>_;
// while(_--)
run();
// std::cerr << "Time:" << clock() - c1 << "ms" << std::endl;
return 0;
}

View Code

​Gym102920H​​ Needle

题意:给你a、b、c数列 找到所有的x+z==2*b的数对

思路:一开始觉得是fft,但是没想到,实际上只要转换一步就可以,转化为每个数字出现的次数然后fft就可以。

fft板子错了,一直wa


日常_#define日常_#include_02


#include<bits/stdc++.h>
#include<complex>
#include<cctype>
using namespace std;
typedef long long ll;typedef double db;
typedef pair<int, int> pii;typedef pair<ll, ll> pll;
typedef pair<int,ll> pil;typedef pair<ll,int> pli;
#define Fi first
#define Se second
#define _Out(a) cerr<<#a<<" = "<<(a)<<endl
#define pi acos(-1)
const int INF = 0x3f3f3f3f, MAXN = 5e5 + 5;
const ll LINF = 0x3f3f3f3f3f3f3f3f, MOD = 998244353;
const db Pi = acos(-1), EPS = 1e-6;
void test(){cerr << "\n";}template<typename T,typename...Args>void test(T x,Args...args){cerr<<x<<" ";test(args...);}
inline ll qpow(ll a, ll b){return b?((b&1)?a*qpow(a*a%MOD,b>>1)%MOD:qpow(a*a%MOD,b>>1))%MOD:1;}
inline ll qpow(ll a, ll b,ll c){return b?((b&1)?a*qpow(a*a%c,b>>1,c)%c:qpow(a*a%c,b>>1,c)) %c:1;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a*b/gcd(a,b);}
inline ll cede(ll a,ll b){if(b<0)return cede(-a,-b);if(a<0)return a/b;return (a+b-1)/b;}
inline ll flde(ll a,ll b){if(b<0)return flde(-a,-b);if(a<0)return (a-b+1)/b;return a/b;}
inline int sign(db x){return x<-EPS ? -1:x>EPS;}
inline int dbcmp(db l,db r){return sign(l - r);}
namespace Fast_IO{
const int MAXL((1 << 18) + 1);int iof, iotp;
char ioif[MAXL], *ioiS, *ioiT, ioof[MAXL],*iooS=ioof,*iooT=ioof+MAXL-1,ioc,iost[55];
char Getchar(){
if (ioiS == ioiT){
ioiS=ioif;ioiT=ioiS+fread(ioif,1,MAXL,stdin);return (ioiS == ioiT ? EOF : *ioiS++);
}else return (*ioiS++);
}
void Write(){fwrite(ioof,1,iooS-ioof,stdout);iooS=ioof;}
void Putchar(char x){*iooS++ = x;if (iooS == iooT)Write();}
inline int rd(){
int x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
inline long long read_ll(){
long long x=0;for(iof=1,ioc=Getchar();(ioc<'0'||ioc>'9')&&ioc!=EOF;)iof=ioc=='-'?-1:1,ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(x=0;ioc<='9'&&ioc>='0';ioc=Getchar())x=(x<<3)+(x<<1)+(ioc^48);return x*iof;
}
void Getstr(char *s, int &l){// isgraph || isalnum || iscntrl || isblank
for(ioc=Getchar();ioc!=EOF&&!isgraph(ioc);)ioc=Getchar();
if(ioc==EOF)Write(),exit(0);
for(l=0;isgraph(ioc);ioc=Getchar())s[l++]=ioc;s[l] = 0;
}
template <class Int>void Print(Int x, char ch = '\0'){
if(!x)Putchar('0');if(x<0)Putchar('-'),x=-x;while(x)iost[++iotp]=x%10+'0',x/=10;
while(iotp)Putchar(iost[iotp--]);if (ch)Putchar(ch);
}
void Putstr(const char *s){for(int i=0;s[i];++i)Putchar(s[i]);}
}
using namespace Fast_IO;
const int maxn=3e6+50,N=3e4;
struct Complex
{
double x, y;
Complex(double x=0,double y=0):x(x),y(y){}
}a1[maxn],a2[maxn];
Complex operator + (Complex a, Complex b) { return Complex(a.x + b.x , a.y + b.y);}
Complex operator - (Complex a, Complex b) { return Complex(a.x - b.x , a.y - b.y);}
Complex operator * (Complex a, Complex b) { return Complex(a.x * b.x - a.y * b.y , a.x * b.y + a.y * b.x);}
int rev [maxn];
int lim = 1, l=0;
//void fft(Complex f[],double tag)
//{
// for (int i = 0; i < lim;++i)
// if(i<rev[i]) swap(f[i], f[rev[i]]);
// for (int mid = 1; mid <lim;mid<<=1)
// {
// Complex wn(cos(pi / mid), tag * sin(pi / mid));
// for (int R = mid << 1, j = 0; j < lim;j+=R)
// {
// Complex w(1, 0);
// for (int k = 0; k < mid;k++,w=w*wn)
// {
// Complex x = f[j + k], y = w * f[j + mid + k];
// f[j + k] = x + y;
// f[j + mid + k] = x - y;
// }
// }
// }
//}
void fft(Complex y[],int len,int on){//on为1或者-1,-1的时候表示逆变换
for(int i=0;i<len;i++)if(i<rev[i])swap(y[i],y[rev[i]]);
for(int h=2;h<=len;h<<=1){
Complex wn(cos(-on*2*pi/h),sin(-on*2*pi/h));
for(int j=0;j<len;j+=h){
Complex w(1,0);
for(int k=j;k<j+h/2;k++){
Complex u=y[k];
Complex t=w*y[k+h/2];
y[k]=u+t;
y[k+h/2]=u-t;
w=w*wn;
}
}
}
if(on==-1){
for(int i=0;i<len;i++){
y[i].x/=len;
}
}
}

int n,m,k,a[maxn],b[maxn],c[maxn],maxx1,maxx2;
int num1[maxn],num2[maxn],ans[maxn];
void run()
{
//cout<<pi<<'\n';
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a[i];a[i]+=N;
maxx1=max(maxx1,a[i]);
}
cin>>m;
for(int i=1;i<=m;++i) cin>>b[i],b[i]+=N;
cin>>k;
for(int i=1;i<=k;++i)
{
cin>>c[i];c[i]+=N;
maxx2=max(maxx2,c[i]);
}

while(lim<=maxx1+maxx2) lim<<=1,l++;
for(int i=0;i<lim;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
for(int i=1;i<=n;++i) a1[a[i]].x+=1;
for(int i=1;i<=k;++i) a2[c[i]].x+=1;
fft(a1,lim,1),fft(a2,lim,1);
for(int i=0;i<=lim;++i) a1[i]=a1[i]*a2[i];
fft(a1,lim,-1);
for(int i=0;i<=lim;++i) {ans[i]=(int)(a1[i].x+0.5);}
int ret=0;
for(int i=1;i<=m;++i) ret+=ans[2*b[i]];
cout<<ret<<'\n';
}
/*

*/
signed main()
{
ios::sync_with_stdio(false),cin.tie(nullptr);
// clock_t c1 = clock();
//int _;cin>>_;
// while(_--)
run();
// std::cerr << "Time:" << clock() - c1 << "ms" << std::endl;
return 0;
}

View Code