版权声明:布呗之路的守望者 https://blog.csdn.net/hypHuangYanPing/article/details/82595747
/**
H. Ryuji doesn't want to study
链接:https://nanti.jisuanke.com/t/31460
题意:单点修改+区间求和
[l,r] ...a[l]*L+a[l+1]*(L-1)+a[l+2]*(L-2)+....a[r]....
L为区间长度;
化简乘法式子
tran : (r+1)*segment [l,r] a[i] - segment [l,r] i*a[i] ;
用树状数组维护即可;
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+7;
ll s[2][maxn],n,a[maxn],m;
ll lowbit(ll x){ return x&(-x);}
void update(ll pos,ll val,ll l){
while(pos<=n){
s[l][pos]-=val;
pos+=lowbit(pos);
}
}
ll sum(ll x,ll l){
ll ans=0;
while(x){
ans+=s[l][x];
x-=lowbit(x);
}
return ans;
}
int main(){
ll k,l,r;
scanf("%lld %lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
update(i,-(a[i]*(n-i+1)),0);
update(i,-a[i],1);
}
while(m--){
scanf("%lld %lld %lld",&k,&l,&r);
if(k==1){//区间求和
ll ans=(sum(r,0)-sum(l-1,0))-((n-r)*(sum(r,1)-sum(l-1,1)));
printf("%lld\n",ans);
}
else{//单点更新
ll now=a[l]-r; a[l]=r;
update(l,now*(n-l+1),0);update(l,now,1);
}
}
return 0;
}
/**
I. Characters with Hash
链接:https://nanti.jisuanke.com/t/31461
题意:给定字符串每一个字符与给定字符相减后组成的新数字的长度;
****tricks****
每次相减后必须保持减数长度为 当前保持长度为2;
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main (){
int t;scanf("%d",&t);
while(t--){
int n;char ch;cin>>n>>ch;
string str;cin>>str;
int ans=0,flag=1;
for(int i=0;i<n;i++){
if(abs(str[i]-ch)==0&&flag) continue;
else if(flag&&abs(str[i]-ch)!=0) ans+=log10(abs(str[i]-ch))+1,flag=0;
else if(!flag) ans+=2;
}
if(ans==0) ans++;cout<<ans<<endl;
}
return 0;
}
/**
G. Trace
链接:https://nanti.jisuanke.com/t/31459
题意:依次给定一些点 每个点和原点(0,0)构成一个矩形 并标注在图上;
下个矩形更新时,会覆盖之前存在于当前矩形内的线段;
细节可以看图 问:更新完所有的点之后 所得到图形的周长;
set+二分
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+7;
int x[maxn],y[maxn];
set<int>s1,s2;
int tmp;
int main (){
int n;scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d %d",&x[i],&y[i]);
s1.insert(0),s2.insert(0);
ll ans=0;
for(int i=n-1;i>=0;i--){
if(i==n-1) {
ans+=x[i]+y[i];
s1.insert(x[i]),s2.insert(y[i]);
}
else {
auto it=s1.lower_bound(x[i]);
ans+=x[i]-*--it;
s1.insert(x[i]);
it=s2.lower_bound(y[i]);
ans+=y[i]-*--it;
s2.insert(y[i]);
}
}
printf("%lld\n",ans);
return 0;
}
/**
F. Features Track
链接:https://nanti.jisuanke.com/t/31458
题意:找最长的连续的<a,b>对;可用ma直接进行模拟最值即可;
一个记录最长的长度 一个记录是否连续即可;
*/
#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,int > mp1,mp2;
int main(){
int t,n,maxn,k,x,y;
scanf("%d",&t);
while(t--){
maxn=0;
scanf("%d",&n);
mp1.clear(),mp2.clear();
for(int i=1;i<=n;i++){
scanf("%d",&k);
for(int j=1;j<=k;j++){
scanf("%d %d",&x,&y);
if(mp2[make_pair(x,y)]==i) continue;
else if(mp2[make_pair(x,y)]==0||mp2[make_pair(x,y)]==i-1){
mp2[make_pair(x,y)]=i;
mp1[make_pair(x,y)]++;
}
else{
mp2[make_pair(x,y)]=i;
mp1[make_pair(x,y)]=1;
}
maxn=max(maxn,mp1[make_pair(x,y)]);
}
}
printf("%d\n",maxn<2?0:maxn);
}
return 0;
}