ABC379(DEF)
D
题意:
操作1:种花
操作2:等待k天,已经种下的花长了k cm
操作3:将所有高度大于等于H的花收割,输出收割花的个数
思路:
队列,将先种的花以及种下的天数塞进队列,查询时当差值当前DAY-花种下的时间大于等于H出队并统计
void solve(){
int q;cin>>q;
priority_queue<int,vector<int>,greater<int>>qe;
int day=0;
while(q--){
int opt;cin>>opt;
if(opt==1){
qe.push(day);
}else if(opt==2){
int t;cin>>t;day+=t;
}else{
int h;cin>>h;
int now=day;
int cnt=0;
while(qe.size()){
int dif=now-qe.top();
if(dif>=h){
cnt++;
qe.pop();
}else break;
}
cout<<cnt<<endl;
}
}
}
E
题意:
给定一个长度为n的字符串
定义f(i,j)=..略
求...
思路:
倒着看,发现当字符串为1234时,答案为:
4
3
34
2
23
234
1
12
123
1234
等于:
4+ (4+33) +(4+33+222) +(4+33+222+1111)
本来想着用python处理一下大整形的
n=int(input())
data=input()
ans,res,cnt=0,0,1
for i in reversed(data):
res+=cnt*int(i)
ans+=res
cnt=cnt*10+1
print(ans)
不过应该是太大了RE+TLE
考虑模拟进位
将每一位的对答案每一位的贡献算一下,十进制进位即可
int a[maxn];
void solve(){
int n;cin>>n;
string s;cin>>s;s=" "+s;
int sum=0;
rep(i,1,n){
sum+=i*(s[i]-'0');
}
rep(i,1,n){
a[i]+=sum;
sum-=(n-i+1)*(s[n-i+1]-'0');
}
int temp=1;
for(int i=1;;i++){
if(!a[i]){
temp=i;break;
}
a[i+1]+=a[i]/10;
a[i]%=10;
}
for(int i=temp-1;i>=1;i--){
cout<<a[i];
}
cout<<endl;
}
F
题意:
一个高度数组,如果i~j之间没有高于j的数,则称i可以看到j
现在给出(a,b),请你输出(b+1,b+2..n)中可以被a,b两者看到的元素数量
思路:
预处理出单调栈数组,即每个数左边第一个大于它的数的位置
显然只要 (b+1,b+2,....n)中的数左边第一个大于它的数的位置小于等于a,说明满足条件
不妨离线查询
将查询按右端点从大到小排序
从右往左将每个数的单调栈数组塞入树状数组统计即可
struct node{
int l,r;
int idx;
bool operator<(const node&a)const{
return r<a.r;
}
};
int n;
int bit[maxn];
int lowbit(int x){return x&-x;}
void add(int p,int x){
while(p<=n){
bit[p]+=x;
p+=lowbit(p);
}
}
int query(int r){
int res=0;
while(r){
res+=bit[r];
r-=lowbit(r);
}
return res;
}
void solve(){
int q;cin>>n>>q;
vector<int>a(n+1);
vector<int>hi(n+1);
rep(i,1,n)cin>>a[i];
stack<int>stk;
for(int i=n;i>=1;i--){
while(stk.size()&&a[stk.top()]<a[i]){
hi[stk.top()]=i;
stk.pop();
}
stk.push(i);
}
while(stk.size()){
hi[stk.top()]=0;
stk.pop();
}
vector<node>qr(q+1);
rep(i,1,q){
int l,r;cin>>l>>r;
qr[i]=(node){l,r,i};
}
sort(qr.begin()+1,qr.end());
int p=n;
// rep(i,1,n){
// debug(hi[i]);
// }
vector<int>ans(q+1);
int cnt=0;
for(int i=q;i>=1;i--){
int L=qr[i].l;
int R=qr[i].r;
// L++;R++;
while(p>R){
if(!hi[p])cnt++;
else{
add(hi[p],1);
}
p--;
}
int idx=qr[i].idx;
ans[idx]=query(L)+cnt;
//[1,l-1]
}
rep(i,1,q){
cout<<ans[i]<<endl;
}
}

浙公网安备 33010602011771号