初级守护
#include<iostream>
#include<iomanip>
#include<cmath>
#include<math.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<bits/stdc++.h>
using namespace std;
int find(int start,int end,int x){
int left,mid,right;
left=start;
right=end;
while(left<=right){
mid=(left+right)/2;
if(a[mid]==x){
int count=1,i;
i=mid-1;
while(i>=start&&a[i]==x){
count++,i--;
i=mid+1;
while(i<=end&&a[i]==x){
count++,i++;
return count;
}//3 while
}//2 while
}else if(a[mid]<x){
left=mid+1;
}else{
right=mid-1;
}//1 else
}//1 while
return 0;
}//1 int
int main(){
int n,c;
cin>>n>>c;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int count=0;
for(int i=0;i<n-1;i++){
count+=find(i+1,n-1,a[i]+c);
}
cout<<count<<endl;
return 0;
}
编译错误
杨穹宇在2022-10-27 13:19:45追加了内容
求大佬找错
#include<bits/stdc++.h>
using namespace std;
const int max=50005;
int n,i,size,l,r,mid,tot1,tot2;
int first[max],num[max],f[max][18],d[max][18],p[max],vis[max];
struct bian{int to,next,len;
};
bian edge[max<<1];
struct{int id,int len;
};
shu a[max],b[max];
inline int get_int(){
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-')c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void build(int x,int y,int z){
edge(++size).next=first[x];
first[x]=size;
edge[size].to=y,edge[size].len=z;
}
inline void dfs(int point,int fa){
for(int u=first[point];u;u=edge[u].next){
int to=edge[u].to;
if(to==fa)continue;
f[to][0]=point,d[to][0]=edge[u].len;
dfs(to,point);
}
}
inline void pre(){
for(int j=1;j<=16;j++)
for(int i=1;i<=n;i++)
if(f[i][j-1]) f[i][j]=f[f[i][j-1]][j-1],d[i][j]=d[i][j-1]+d[f[i][j-1]][j-1];
}
inline void search(int point,int fa){
if(vis[point])return;
vis[point]=1;int tag=0;
for(int u=first(point);u;u=edge[u].next){
int to=edge[u].to;
if(to==fa)continue;
tag=1;
search(to,point);
vis[point]&=vis[to];
}
if(!tag)vis[point]=0;
}
inline bool comp(const shu &a,const shu &b){
return a.len<b.len;
}
inline bool check(int mid){
tot1=tot2=0;
for(int i=1;i<=n;i++)vis[i]=0;
for(int i=1;i<=m;i++){
int sum=0,p[i];
for(int k=16;k>=0;k--)
if(f[x][k]>1&&sum+d[x][k]<=mid) sum+=d[x][k],x=f[x][k];
if(f[x][0]==1&&sum+=d[x][0]<=mid)a[++tot1].len=mid-sum=d[x][0],a[tot1].id=x;
else vis[x]=1;
}
search(1,0);
if(vis[1]) return 1;
for(int u=first[1];u;u=edge[u].next)
if(!vis[edge[u].to]) b[++tot2].len=edge[u].len,b[tot2].id=edge[u].to;
sort(a+1,a+tot1+1,comp),sort(b+1,b+tot2+1,comp);
if(tot1<tot2) return 0;
int tag=1;
for(int i=1;i<=tot1;i++){
if(!vis[a[i].id]) vis[a[i].id]=1;
else if(a[i].len>=b[tag].len) vis[b[tag].id]=1;
while(tag<=tot2&&vis[b[tag].id]) tag++;
if(tag>tot2) return 1;
}
return tag>tot2;
}
int main(){
n=get_int();
for(int i=1;i<=n;i++){
int x=get_int(),y=get_int(),z=get_int();
build(x,y,z),build(y,x,z);
}
m=get_int();
for(int i=1;i<=m;i++) p[i]=get_int();
dfs(1,0);
pre();
l=0,r=le9;int tag=0;
while(1<r){
mid=(1+r)>>1;
if(check(mid)) tag=1,r=mid;
else l=mid+1;
}
if(tag) cout<<r<<"\n";
else cout<<"-1\n";
return 0;
}
杨穹宇在2022-10-30 20:29:11追加了内容
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b,c,max,n;
cin>>n;
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
for(int k=0;k<=n;k++){
if((i+j)%2==0&&(k+j)%3==0&&(i+k)%5==0&&i+j+k>max){
max=i+j+k;
a=i;
b=j;
c=k;
}
}
}
}
cout<<max<<" "<<a<<" "<<b<<" "<<c;
return 0;
}
在控制台时没过!!!
杨穹宇在2022-10-31 13:26:38追加了内容
#include<bits/stdc++.h>
using namespace std;
int n;
struct P{
int l,r;int t;
}a[200010];
int f[200010];
bool cmp(P u,P v){
return u.r<v.r;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
a[i].t=i;
}
sort(a+1,a+1+n,cmp);
int cnt=1,r=a[1].r;
f[cnt]=a[1].t;
for(int i=2;i<=n;i++){
if(a[i].l>r){
r=a[i].r;
cnt++;
f[cnt]=a[i].t;
}
}
sort(f+1,f+1+cnt);
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
cout<<f[i]<<" ";
}
return 0;
}
初级启示者
没必要这么复杂
先用sort把a从小到大排序
遍历1~n
遍历i+1~n
如果a[j]-a[i]==m,计数
如果a[j]-a[i]>=m,这时候无需继续遍历,直接break。如果不break会TLE 80分
输出cnt
很简单,如果这一题做对了,5422 A + B = C 也非常简单