A Station and Bus
傳送門
陳述題
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
string s;
int main()
{
cin>>s;
if(s!="AAA"&&s!="BBB")cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
B Count Balls
傳送門
陳述題
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
ll n,a,b;
int main()
{
cin>>n>>a>>b;
if(a+b==0)cout<<0<<endl;
ll ans=n/(a+b)*a+min(n%(a+b),a);
cout<<ans<<endl;
return 0;
}
C Tax Increase
傳送門
先算出max(ceil(a/0.08),ceil(b/0.1)),再看這個數能回去否?
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
int a,b;
int main()
{
cin>>a>>b;
int t1=ceil(a*1.0/0.08),t2=ceil(b*1.0/0.1);
int t=max(t1,t2);
int a1=floor(t*0.08),a2=floor(t*0.1);
if(a1==a&&a2==b)pf(t);
else pf(-1);
return 0;
}
D String Formation
傳送門
用再加個反轉標記實現
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
deque<char>q;
string s;
int qq,com,f;
char c;
int main()
{
cin>>s>>qq;
rep(i,0,s.size()-1)q.push_back(s[i]);
bool flag=true;
rep(i,1,qq){
cin>>com;
if(com==1)flag=!flag;
else{
cin>>f>>c;
if(flag){
if(f==1)q.push_front(c);
else q.push_back(c);
}else{
if(f==2)q.push_front(c);
else q.push_back(c);
}
}
}
if(flag){
while(!q.empty()){
cout<<q.front();
q.pop_front();
}
}else{
while(!q.empty()){
cout<<q.back();
q.pop_back();
}
}
return 0;
}
E Divisible Substring
傳送門
必須明白取餘證明
那麼天大的數我們也能知道這個數是不是能整除
如果枚舉的話肯定不行的
那麼考慮從後往前算餘數,並且記錄餘數出現的個數,比如算到第位,此時餘數爲,但是先前有餘數爲的個數爲,那麼也就是說我們可以直接從第位到那兩個貢獻前面的位置作爲一個子字符串,因爲此時前面正好能整除,從數學方面考慮下,,因爲,又因爲與互質,那麼必然,非常巧妙的方法,但是素數還要格外考慮一下和,因爲與之不互質,這兩個數都有個特點就是最後一位都和這兩個取模爲,也就是從前往後考慮,直接累加當前第幾位,也就是幾種選擇。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e4+5;
int n,p,cnt[N];
string s;
int main()
{
cin>>n>>p>>s;
int size=s.size();
ll ans=0;
if(p==2||p==5)rep(i,0,size-1){if((s[i]-'0')%p==0)ans+=i+1;}
else{
ll base=1,now=0;
cnt[0]=1;
per(i,size-1,0){
now=(((s[i]-'0')*base)%p+now)%p;
base=(base*10)%p;
ans+=cnt[now];++cnt[now];
}
}
cout<<ans<<endl;
return 0;
}
F Removing Robots
傳送門
這個題我的做法可能有點繁瑣,首先肯定要按起始座標軸排序,然後考慮表示最後集合中第個機器人爲最後一個的集合個數,其中表示爲空集,那麼如果每個機器人沒有這個範圍,那麼就從左往右考慮,,也就是到了第位,把這個機器人放到前面那些集合的尾部即可,但是每個機器人此時有的範圍,那麼什麼情況下會讓部分集合不存在呢?考慮前面有的機器人激活後的範圍已經觸及到了,那麼這個機器人前面的那些集合必然不行,再加強一下,也就是說找到每個機器人左邊第一個範圍觸及到他的起始座標的,然後把找到的這個機器人前邊的前綴和減去就是答案。可以看出最後需要維護出每個機器人左邊第一個能觸及到他的機器人,這塊可以用個優先隊列處理下(詳見代碼),之後當算出一個後,對於後面所有都要加上這個值,那麼用差分數組幫助實現,再維護一個的前綴和數組用來減去對應的值即可。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=2e5+5;
const int P=998244353;
pii robs[N];
int n,cop[N],ner[N];
ll dp[N],sum[N],bb[N];
struct eff{
int l,r,id;
bool operator < (const eff a)const{
return id<a.id;
}
};
priority_queue<eff>q;
int findd(int x){return upper_bound(cop+1,cop+n+2,x)-cop;}
int main()
{
sc(n);
rep(i,1,n)sc2(robs[i].fi,robs[i].se);
sort(robs+1,robs+n+1);
rep(i,1,n)cop[i]=robs[i].fi;
cop[n+1]=inf;
rep(i,1,n){
while(!q.empty()){
auto u=q.top();
if(i>u.r)q.pop();
else if(i>=u.l&&i<=u.r&&!ner[i]){
ner[i]=u.id;
break;
}else break;
}
int nx=robs[i].fi+robs[i].se-1,pos=findd(nx);
q.push({i+1,pos-1,i});
}
bb[1]++;sum[0]=1;dp[0]=1;
rep(i,1,n){
bb[i]=(bb[i]+bb[i-1])%P;
dp[i]=(dp[i]+bb[i])%P;
if(ner[i]>0)dp[i]=((dp[i]-sum[ner[i]-1])%P+P)%P;
bb[i+1]=(bb[i+1]+dp[i])%P;
sum[i]=(dp[i]+sum[i-1])%P;
//cout<<dp[i]<<" "<<sum[i]<<endl;
}
cout<<sum[n]<<endl;
return 0;
}