H
一开始以为考后缀和,耽误了一会。后面直接看样例猜结论,数字乘位置为对答案的贡献
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
const int M=1000000007;
void solve()
{
int n;cin>>n;
stack<int>st;
int sum=0;
for(int i=1;i<=n;i++){
int ou,in;cin>>ou>>in;
while(ou--&&!st.empty()){sum-=st.top()*st.size()%M;st.pop();}
st.push(in);sum+=in*st.size()%M;
cout<<sum%M<<'\n';
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
solve();
return 0;
}
H
目标队前面的队如果可以挪就挪走,就是一个排序减去前面的去重
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
struct st{
string s;int gra;int tim;
};
bool cmp(st s,st b){
if(s.gra!=b.gra)return s.gra>b.gra;
else return s.tim<b.tim;
}
void solve()
{
int n;cin>>n;
map<string,int>mp;
mp.clear();
vector<st>s6(n);
for(int i=0;i<n;i++){
cin>>s6[i].s>>s6[i].gra>>s6[i].tim;
mp[s6[i].s]++;
}
int m;cin>>m;
vector<st>s7(m);
for(int i=0;i<m;i++){
cin>>s7[i].s>>s7[i].gra>>s7[i].tim;
mp[s7[i].s]++;
}
/*
cout<<'\n';
for(int i=0;i<n;i++)cout<<s6[i].s<<' '<<s6[i].gra<<' '<<s6[i].tim<<'\n';
cout<<'\n';
for(int i=0;i<m;i++)cout<<s7[i].s<<' '<<s7[i].gra<<' '<<s7[i].tim<<'\n';
*/
sort(s6.begin(),s6.end(),cmp);
sort(s7.begin(),s7.end(),cmp);
/*
cout<<'\n';
for(int i=0;i<n;i++)cout<<s6[i].s<<' '<<s6[i].gra<<' '<<s6[i].tim<<'\n';
cout<<'\n';
for(int i=0;i<m;i++)cout<<s7[i].s<<' '<<s7[i].gra<<' '<<s7[i].tim<<'\n';
*/
int rak;
int cnt=0;
for(int i=0;i<n;i++){
if(s6[i].s=="lzr010506"){
rak=i+1-cnt;
cnt=0;
break;
}
if(mp[s6[i].s]==2)cnt++;
}
int ans=0;
for(int i=0;i<m;i++){
if(s7[i].s=="lzr010506"){
ans=i+1-cnt;
break;
}
if(mp[s7[i].s]==2)cnt++;
}
cout<<min(rak,ans)<<'\n';
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
solve();
return 0;
}
A
数学推公式+快速幂+组合数
思路
板子
//快速幂
int fapo(int base,int pow){
int result=1;
while(pow){
if(pow&1)result*=base;
base*=base;
pow>>=1;
}
return result;
}
//杨辉三角推组合数
int cont[5005][5005];
void solve()
{
cont[1][1]=1;
for(int i=0;i<=5001;i++){
cont[i][i]=1;
cont[i][0]=1;
}
for(int i=1;i<=5000;i++){
for(int j=1;j<i;j++){
cont[i][j]=cont[i-1][j-1]+cont[i-1][j];
}
}
}
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
int cont[5005][5005];
int ct(int x,int y){
return cont[x][y];
}
int fapo(int base,int po,int q){
int result=1%q;
while(po){
if(po&1)result=(result*base)%q;
base=(base*base)%q;
po>>=1;
}
return result;
}
void solve()
{
int n,m,q;cin>>n>>m>>q;
cont[1][1]=1;
for(int i=0;i<=5001;i++){
cont[i][i]=1;
cont[i][0]=1;
}
for(int i=1;i<=5001;i++){
for(int j=1;j<i;j++){
cont[i][j]=(cont[i-1][j-1]%q+cont[i-1][j]%q)%q;
}
}//组合数
int sum=0;
for(int i=1;i<=n;i++){
sum=(sum+(ct(n,i)%q*fapo(fapo(2,(n-i),q)%q,(m-1),q)%q*fapo(fapo(2,i,q)-1,m-1,q)%q)%q)%q;
}
cout<<sum<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
solve();
return 0;
}