#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
constint N=10005;
int t,y_1,y_2,n,x,ext[N];
intmain(){
for (scanf("%d",&t);t;--t)
{
RI i; scanf("%d%d",&y_1,&n);
for (i=1970;i<=9999;++i) ext[i]=1;
for (i=1;i<=n;++i) scanf("%d",&x),ext[x]=0;
int rk=1; scanf("%d",&y_2);
for (i=y_1;i<y_2;++i) rk+=ext[i];
printf("%d\n",rk);
}
return0;
}
#include<cstdio>#include<iostream>#include<utility>#include<algorithm>#define int long long#define RI register int#define CI const int&#define fi first#define se secondusingnamespace std;
typedef pair <int,int> pi;
constint N=100005;
int t,n; pi p[N];
signedmain(){
for (scanf("%lld",&t);t;--t)
{
RI i,j; for (scanf("%lld",&n),i=1;i<=n;++i)
scanf("%lld%lld",&p[i].fi,&p[i].se);
sort(p+1,p+n+1); int ans=0,ret=0,sum1=0,sum2=0;
for (i=1,j=n;i<=n;++i)
{
sum1+=p[i].se; ret-=p[i].fi*p[i].se;
while (j>=i&&sum2+p[j].se<sum1) sum2+=p[j].se,ret+=p[j].fi*p[j].se,--j;
if (i>j) break;
ans=max(ans,ret+(sum1-sum2)*p[j].fi);
}
ret=sum1=sum2=0;
for (i=n,j=1;i>=1;--i)
{
sum1+=p[i].se; ret+=p[i].fi*p[i].se;
while (j<=i&&sum2+p[j].se<sum1) sum2+=p[j].se,ret-=p[j].fi*p[j].se,++j;
if (i<j) break;
ans=max(ans,ret-(sum1-sum2)*p[j].fi);
}
printf("%lld\n",ans);
}
return0;
}
5|0D. New Houses
首先不难发现对于ai≥bi的人,直接先让他们住在一起肯定是最优的
剩下的人如果空位允许它们每个人单独坐那肯定最优,否则就要考虑选出一部分人和前面确定的人坐在一起
手玩一下会发现此时把一个单独的人分出去对答案的减少量为b−a,贪心地每次把最小的分出去即可
#include<bits/stdc++.h>usingnamespace std;
#define int long longint t, n, m;
signedmain(){
ios::sync_with_stdio(0); cin.tie(0);
cin >> t;
while (t--){
cin >> n >> m;
int ans=0;
int cnt=0;
vector<int> vec;
int mn = (int)1e18+5;
for (int i=1; i<=n; ++i){
int a, b; cin >> a >> b;
if (a>=b){
ans+=a;
++cnt;
}else{
ans+=b;
vec.push_back(b-a);
}
mn = min(max(a, b)-min(a, b), mn);
}
sort(vec.begin(), vec.end());
if (0==cnt && 2*n-1<=m){
cout << ans << '\n';
}elseif (1==cnt && 2*n-1<=m){
cout << ans-mn << '\n';
}else{
int pos=0;
bool ok=false;
while (2*n-cnt>m){
ok=true;
ans -= vec[pos++];
++cnt;
// printf("n=%lld m=%lld cnt=%lld\n", n, m, cnt); }
// printf("cnt=%lld ok=%lld\n", cnt, ok); cout << ans << '\n';
}
}
return0;
}
#include<bits/stdc++.h>#include<ext/pb_ds/assoc_container.hpp>#define int long long#define RI register int#define CI const int&#define Tp template <typename T>usingnamespace std;
constint N=100005;
int t,n,q,opt,a[N],c[N],pos[N],x,y,ansl,ansr;
usingnamespace __gnu_pbds;
constint RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count();
structchash {
intoperator()(int x)const{ return x ^ RANDOM; }
};
typedef gp_hash_table<int, int, chash> hash_t;
classFileInputOutput{
private:
staticconstint S=1<<21;
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,S,stdin),A==B)?EOF:*A++)#define pc(ch) (Ftop!=Fend?*Ftop++=ch:(fwrite(Fout,1,S,stdout),*(Ftop=Fout)++=ch))char Fin[S],Fout[S],*A,*B,*Ftop,*Fend; int pt[20];
public:
inlineFileInputOutput(void){ Ftop=Fout; Fend=Fout+S; }
Tp inlinevoidread(T& x){
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));
}
Tp inlinevoidwrite(T x,constchar ch='\n'){
RI ptop=0; while (pt[++ptop]=x%10,x/=10);
while (ptop) pc(pt[ptop--]+48); pc(ch);
}
inlinevoidflush(void){
fwrite(Fout,1,Ftop-Fout,stdout);
}
#undef tc#undef pc}F;
classTree_Array{
private:
int bit[N];
public:
#define lowbit(x) (x&-x)inlinevoidinit(void){
for (RI i=0;i<=n;++i) bit[i]=0;
}
inlineintget(RI x,int ret=0){
for (;x;x-=lowbit(x)) ret+=bit[x]; return ret;
}
inlinevoidadd(RI x,CI y){
for (;x<=n;x+=lowbit(x)) bit[x]+=y;
}
#undef lowbit}BIT;
classSegment_Tree{
private:
int anc[N<<2],L[N<<2],R[N<<2]; hash_t num[N<<2];
#define TN CI now=1,CI l=1,CI r=n#define LS now<<1,l,mid#define RS now<<1|1,mid+1,rinlineboolcheck(CI now,vector <int>& vec){
int cnt=0; for (auto col:vec) cnt+=num[now][col];
return cnt==R[now]-L[now]+1;
}
inlinevoidleft_binary(vector <int>& vec,CI now,CI l,CI r){
if (l==r)
{
if (check(now,vec)) ansl=l; return;
}
int mid=l+r>>1;
if (check(now<<1|1,vec)) ansl=L[now<<1|1],left_binary(vec,LS);
elseleft_binary(vec,RS);
}
inlinevoidright_binary(vector <int>& vec,CI now,CI l,CI r){
if (l==r)
{
if (check(now,vec)) ansr=r; return;
}
int mid=l+r>>1;
if (check(now<<1,vec)) ansr=R[now<<1],right_binary(vec,RS);
elseright_binary(vec,LS);
}
public:
inlinevoidbuild(TN){
num[now].clear(); L[now]=l; R[now]=r;
if (l==r) return (void)(pos[l]=now); int mid=l+r>>1;
anc[now<<1]=anc[now<<1|1]=now; build(LS); build(RS);
}
inlinevoidupdata(CI pos,CI col,CI mv,TN){
num[now][col]+=mv; if (l==r) return; int mid=l+r>>1;
if (pos<=mid) updata(pos,col,mv,LS); elseupdata(pos,col,mv,RS);
}
inlinevoidleft_up(vector <int>& vec,CI now,CI l,CI r){
if (now==1) return; int fa=anc[now];
if (now==(fa<<1)) returnleft_up(vec,fa,L[fa],R[fa]);
if (check(fa<<1,vec)) return ansl=L[fa],left_up(vec,fa,L[fa],R[fa]);
returnleft_binary(vec,fa<<1,L[fa<<1],R[fa<<1]);
}
inlinevoidright_up(vector <int>& vec,CI now,CI l,CI r){
if (now==1) return; int fa=anc[now];
if (now==(fa<<1|1)) returnright_up(vec,fa,L[fa],R[fa]);
if (check(fa<<1|1,vec)) return ansr=R[fa],right_up(vec,fa,L[fa],R[fa]);
returnright_binary(vec,fa<<1|1,L[fa<<1|1],R[fa<<1|1]);
}
#undef TN#undef LS#undef RS}SEG;
signedmain(){
//freopen("F.in","r",stdin); freopen("F.out","w",stdout);for (F.read(t);t;--t)
{
RI i; F.read(n); F.read(q); BIT.init(); SEG.build();
for (i=1;i<=n;++i) F.read(c[i]),SEG.updata(i,c[i],1);
for (i=1;i<=n;++i) F.read(a[i]),BIT.add(i,a[i]);
while (q--)
{
F.read(opt); F.read(x); F.read(y);
if (opt==1) SEG.updata(x,c[x],-1),SEG.updata(x,c[x]=y,1);
elseif (opt==2) BIT.add(x,-a[x]),BIT.add(x,a[x]=y); else {
vector <int> vec(y); for (i=0;i<y;++i) F.read(vec[i]);
ansl=x; SEG.left_up(vec,pos[x],x,x);
ansr=x; SEG.right_up(vec,pos[x],x,x);
F.write(BIT.get(ansr)-BIT.get(ansl-1));
}
}
}
return F.flush(),0;
}
8|0G. Swapping Operation
看过题人数不是很可做啊
9|0H. Canvas
这题看起来挺可做的,但后面没啥时间了就没认真想,留着以后再说吧
10|0I. Path Planning
不难发现从小到大枚举,强制枚举到的数都要在一条路径上
显然合法的充要条件就是把所有出线的位置的二元组(xi,yi)排序后,第二维依然要保持有序
直接拿个set维护下所有二元组,当某次插入破坏了上述性质就说明不合法
#include<cstdio>#include<iostream>#include<utility>#include<set>#define RI register int#define CI const int&#define fi first#define se secondusingnamespace std;
typedef pair <int,int> pi;
constint N=1e6+5;
int t,n,m,x; pi pos[N];
intmain(){
for (scanf("%d",&t);t;--t)
{
RI i,j; set <pi> rst;
for (scanf("%d%d",&n,&m),i=1;i<=n;++i)
for (j=1;j<=m;++j) scanf("%d",&x),pos[x]={i,j};
for (i=0;i<=n*m;++i)
{
if (i==n*m) { printf("%d\n",n*m); break; }
rst.insert(pos[i]);
auto it=rst.find(pos[i]);
if (it!=rst.begin())
{
auto pre=it; --pre;
if (pre->se>it->se)
{
printf("%d\n",i); break;
}
}
auto nxt=it; ++nxt;
if (nxt!=rst.end())
{
if (it->se>nxt->se)
{
printf("%d\n",i); break;
}
}
}
}
return0;
}
11|0J. X Equals Y
这题徐神开场就看了而且也想出了基本正确的做法,但由于机时问题就没来得及写,坐等徐神补题吧
12|0K. Peg Solitaire
大力暴搜题,直接状压棋盘状态然后枚举所有可能的情况即可
#include<cstdio>#include<iostream>#include<unordered_set>#define int long long#define RI register int#define CI const int&usingnamespace std;
constint N=10,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int t,n,m,k,x,y,ans; unordered_set <int> rst;
inlineintID(CI x,CI y){
return x*m+y;
}
inlinevoidDFS(CI mask,CI num){
ans=min(ans,num); if (num==1) return;
for (RI i=0;i<n;++i) for (RI j=0;j<m;++j)
if ((mask>>ID(i,j))&1LL)
{
for (RI k=0;k<4;++k)
{
int rx=i+dx[k],ry=j+dy[k];
if (rx<0||rx>=n||ry<0||ry>=m) continue;
if (!((mask>>ID(rx,ry))&1LL)) continue;
int tx=rx+dx[k],ty=ry+dy[k];
if (tx<0||tx>=n||ty<0||ty>=m) continue;
if ((mask>>ID(tx,ty))&1LL) continue;
int nmask=mask^(1LL<<ID(i,j))^(1LL<<ID(rx,ry))^(1LL<<ID(tx,ty));
if (rst.count(nmask)) continue;
rst.insert(nmask); DFS(nmask,num-1);
}
}
}
signedmain(){
for (scanf("%lld",&t);t;--t)
{
RI i; scanf("%lld%lld%lld",&n,&m,&k);
int mask=0; for (i=1;i<=k;++i)
scanf("%lld%lld",&x,&y),--x,--y,mask|=(1LL<<ID(x,y));
ans=k; rst.insert(mask); DFS(mask,k);
printf("%lld\n",ans); rst.clear();
}
return0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现