xlxl @ 2019-07-16 16:31:06
#include<bits/stdc++.h>
using namespace std;
char tot;
long long u,v;
long long b[100010],a[100010],sum[100010],add[100010];
int QMQ,gg,h,n,m,L[100010],R[100010],pos[100010];
void Blocking(int x){
int l=(x-1)*h+1;
int r=min(x*h,x);
for(int i=l;i<=r;i++){
b[i]=a[i];
}
sort(b+l+1,b+r+1);
}
void modify(long long x,long long y,int d){
if(pos[x]==pos[y]){
for(int i=x;i<=y;i++){
a[i]+=d;
}
}
else{
for(int i=x;i<=pos[x]*h;i++){
a[i]+=d;
}
for(int i=(pos[y]-1)*h+1;i<=y;i++){
a[i]+=d;
}
for(int i=pos[x]+1;i<=pos[y]-1;i++){
add[i]+=d;
}
}
}
long long find(int x,int v){
int l=(x-1)*h+1;
int r=min(x*h,x);
int mid=(l+r)/2;
while(l<=r){
if(a[mid]<v)
l=mid+1;
else{
r=mid-1;
}
}
}
long long found(long long x,long long y,long long z){
int ans=0;
if(pos[x]==pos[y]){
for(int i=x;i<=y;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
}
for(int i=x;i<=pos[x]*h;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
for(int i=(pos[y]-1)*h+1;i<=y;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
for(int i=pos[x]+1;i<=pos[y]-1;i++){
ans+=find(i,z-add[i]);
}
}
int main(){
cin>>n>>m;
h=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
pos[i]=(i-1)/h+1;
b[i]=a[i];
}
if(n%h!=0)
gg=n/h+1;
else
gg=n/h;
for(int i=1;i<=gg;i++){
Blocking(i);
}
for(int i=1;i<=m;i++){
cin>>tot>>u>>v>>QMQ;
if(tot=='M'){
modify(u,v,QMQ);
}
else{
cout<<found(u,v,QMQ)<<endl;
}
}
return 0;
}
by xlxl @ 2019-07-16 16:42:46
#include<bits/stdc++.h>
using namespace std;
char tot;
long long u,v;
long long b[100010],a[100010],sum[100010],add[100010];
int QMQ,gg,h,n,m,L[100010],R[100010],pos[100010];
void Blocking(int x){
int l=(x-1)*h+1;
int r=min(x*h,n);
for(int i=l;i<=r;i++){
b[i]=a[i];
}
sort(b+l,b+r+1);
}
void modify(long long x,long long y,int d){
if(pos[x]==pos[y]){
for(int i=x;i<=y;i++){
a[i]+=d;
}
}
else{
for(int i=x;i<=pos[x]*h;i++){
a[i]+=d;
}
for(int i=(pos[y]-1)*h+1;i<=y;i++){
a[i]+=d;
}
for(int i=pos[x]+1;i<=pos[y]-1;i++){
add[i]+=d;
}
}
}
long long find(int x,int v){
int l=(x-1)*h+1;
int r=min(x*h,n);
int mid=(l+r)/2;
while(l<=r){
if(a[mid]<v)
l=mid+1;
else{
r=mid-1;
}
}
}
long long found(long long x,long long y,long long z){
int ans=0;
if(pos[x]==pos[y]){
for(int i=x;i<=y;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
}
for(int i=x;i<=pos[x]*h;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
for(int i=(pos[y]-1)*h+1;i<=y;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
for(int i=pos[x]+1;i<=pos[y]-1;i++){
ans+=find(i,z-add[i]);
}
}
int main(){
cin>>n>>m;
h=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
pos[i]=(i-1)/h+1;
b[i]=a[i];
}
gg=ceil(n/h);
for(int i=1;i<=gg;i++){
Blocking(i);
}
for(int i=1;i<=m;i++){
cin>>tot>>u>>v>>QMQ;
if(tot=='M'){
modify(u,v,QMQ);
}
else{
cout<<found(u,v,QMQ)<<endl;
}
}
return 0;
}
无输出。。【可怜】
by 薇草王不留行 @ 2019-07-16 17:27:36
@xlxl 你的tot输入时会把其他的输入吞掉,;
cin>>tot>>u>>v>>QMQ;
应写成
scanf("%s%d%d%d",tot,&u,&v,&QMQ);
by xlxl @ 2019-07-17 08:34:55
@薇草王不留行 会有空格啊
by xlxl @ 2019-07-17 08:35:22
@薇草王不留行 tot只有一个字符
by 薇草王不留行 @ 2019-07-17 08:45:25
前面的话当我没说,
@xlxl 你的find码错了,循环出不来
by xlxl @ 2019-07-17 09:33:06
@薇草王不留行 还是不对,二分蒙了
#include<bits/stdc++.h>
using namespace std;
char tot;
long long u,v;
long long b[100010],a[100010],sum[100010],add[100010];
long long QMQ,gg,h,n,m,L[100010],R[100010],pos[100010];
void Blocking(long long x){
long long l=(x-1)*h+1;
long long r=min(x*h,n);
for(long long i=l;i<=r;i++){
b[i]=a[i];
}
sort(b+l,b+r+1);
}
void modify(long long x,long long y,long long d){
if(pos[x]==pos[y]){
for(long long i=x;i<=y;i++){
a[i]+=d;
}
}
else{
for(long long i=x;i<=pos[x]*h;i++){
a[i]+=d;
}
for(long long i=(pos[y]-1)*h+1;i<=y;i++){
a[i]+=d;
}
for(long long i=pos[x]+1;i<=pos[y]-1;i++){
add[i]+=d;
}
}
}
long long find(long long x,long long v){
long long l=(x-1)*h+1;
long long r=min(x*h,n);
long long tmp=r;
while(l<=r){
long long mid=(l+r)/2;
if(b[mid]<v)
r=mid-1;
else{
l=mid+1;
}
}
return tmp-l+1;
}
long long found(long long x,long long y,long long z){
long long ans=0;
if(pos[x]==pos[y]){
for(long long i=x;i<=y;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
}
for(long long i=x;i<=pos[x]*h;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
for(long long i=(pos[y]-1)*h+1;i<=y;i++){
if(a[i]+add[pos[i]]>=z){
ans++;
}
}
for(long long i=pos[x]+1;i<=pos[y]-1;i++){
ans+=find(i,z-add[i]);
}
return ans;
}
int main(){
cin>>n>>m;
h=sqrt(n);
for(long long i=1;i<=n;i++){
cin>>a[i];
pos[i]=(i-1)/h+1;
b[i]=a[i];
}
gg=ceil(n/h);
for(long long i=1;i<=gg;i++){
Blocking(i);
}
for(long long i=1;i<=m;i++){
cin>>tot>>u>>v>>QMQ;
if(tot=='M'){
modify(u,v,QMQ);
}
else{
cout<<found(u,v,QMQ)<<endl;
}
}
return 0;
}