A:
初看没啥思路,但是这个数据范围出奇的小;
其实这道题让我们觉得困难的原因是因为它有两个变量,如果变成仅对一个变量求最小值,这其实就是一个简单的完全背包问题;
因为M<=1000,val<=200,所以最终每个元素和的可能取值不会超过200 000,
考虑对于每一种存在的a的和的取值,求出它的b的和的最小值,然后对二者乘积找最小值;
code:
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
typedef pair<string,string>Pss;
//const int N=1000*200+5,mod=1e9+7,M=1e6+10;
int lowbit(int x){
return x&(-x);}
void solve(){
int n,m;
cin>>n>>m;
vector<int>u(m+1),v(m+1),a(m+1),b(m+1);
fr(i,1,m){
cin>>ui>>vi>>ai>>bi;
}
//dppointcosta=mincostb
int N=200*m+5;
vector<vector<int>>dp(n+1,vector<int>(N,inf));
dp10=0;
fr(C,1,N-1){
fr(i,1,m){
if(C>=ai){
dpv\[i]C=min(dpv\[i]C,dpu\[i]C-a\[i]+bi);
}
}
}
int minx=inf;
int ans1=0;
int ans2=0;
fr(i,1,N-1){
if(dpni!=inf){
if(dpni*i<minx){
minx=dpni*i;
ans1=i;
ans2=dpni;
}
}
}
cout<<ans1<<" "<<ans2<<"\n";
}
signed main(){
GG;
int _t=1;
cin>>_t;
while(_t--){
solve();
}
}
F
2026蓝桥省B LQ序列 原题
将每个问号同时看成1,0,统计1的前缀/0的后缀
对于每个?,比较前后缀大小,确定该点为0/1的贡献大
code:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
typedef pair<string,string>Pss;
const int N=2e4+10,mod=1e9+7,M=1e6+10;
int lowbit(int x){
return x&(-x);}
void solve(){
int n;
cin>>n;
string s;
cin>>s;
s=" "+s;
vector<int>pl(n+5),eq(n+5),c(n+5),pre(n+5),ed(n+5);
for(int i=1;i<=n;i++){
if(si=='1'||si=='?')pli=pli-1+1;
else pli=pli-1;
}
for(int i=n;i>=1;i--){
if(si=='0'||si=='?')eqi=eqi+1+1;
else eqi=eqi+1;
}
for(int i=1;i<=n;i++){
if(si=='1')ci=0;
else if(si=='0')ci=1;
else{
if(pli<eqi)ci=0;
else ci=1;
}
}
ll ans=0;
ll cnt=0;
for(int i=1;i<=n;i++){
if(ci==0)prei=prei-1+1;
else prei=prei-1;
}
for(int i=1;i<=n;i++){
if(ci==1){
ans+=prei;
}
}
cout<<ans<<"\n";
}
int main(){
GG;
int _t=1;
cin>>_t;
while(_t--){
solve();
}
}
H:
注意下如果共线且距离<=2,需要两次移动来抵消共线方向的偏移;
code:
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
typedef pair<string,string>Pss;
const int N=2e4+10,mod=1e9+7,M=1e6+10;
int lowbit(int x){
return x&(-x);}
void solve(){
int x,y,X,Y;
cin>>x>>y>>X>>Y;
int dt1=abs(X-x);
int dt2=abs(Y-y);
int dt=max(dt1,dt2);
if(dt1==0&&dt2==0){
cout<<0<<"\n";
return;
}
else if(dt1==0||dt2==0){
if(dt<=2){
cout<<2<<"\n";
return;
}
}
cout<<(dt+1)/2<<"\n";
}
signed main(){
GG;
int _t=1;
cin>>_t;
while(_t--){
solve();
}
}
I
字典树模板,反转插入看有多少节点即可
code:
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
typedef pair<string,string>Pss;
const int N=3e5+10,mod=1e9+7,M=1e6+10;
int lowbit(int x){
return x&(-x);}
int idx=0;
int sonN26;
int cntN;
int n;
void ist(string s){
int p=0;
int sz=s.size();
fr(i,0,sz-1){
int u=si-'a';
if(!sonpu){
sonpu=++idx;
}
p=sonpu;
}
cntp++;
}
void solve(){
cin>>n;
fr(i,1,n){
string s;
cin>>s;
reverse(all(s));
ist(s);
}
cout<<idx<<"\n";
}
signed main(){
GG;
int _t=1;
//cin>>_t;
while(_t--){
solve();
}
}
J
target string SCCPC;
我们不妨统计中间的C,看有多少条路径以它为中心
记录每一个C有多少个S与它相连;
记录每一个P有多少C与它相连;
那么对于每一个C, 搜索与它之间相邻的点,是c则统计相邻S的个数,是p则统计相邻c个数,-1(去掉自己);
相乘
code:
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f
#define GG ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define cnot cout<<"NO"<<"\n"
#define cyes cout<<"YES"<<"\n"
#define cans cout<<ans<<"\n"
#define pb push_back
#define x0 first
#define y0 second
#define lc p<<1
#define rc p<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
#define sp(x) fixed<<setprecision(x)
#define all(v) v.begin(),v.end()
#define fr(i,st,ed) for(int i=st;i<=ed;i++)
#define ffr(i,st,ed,dt) for(int i=st;i<=ed;i+=dt)
using namespace std;
typedef pair<int,string>Pis;
typedef pair<int,int>Pii;
typedef pair<string,string>Pss;
const int N=2e4+10,mod=1e9+7,M=1e6+10;
int lowbit(int x){
return x&(-x);}
//tag:sccpc
// num1 c-s
// num2 p-c
//(s)c<-c->p(c)
void solve(){
int n;
cin>>n;
vector<char>c(n+1);
vector<int>num1(n+1),num2(n+1);
vector<vector<int>>g(n+1);
fr(i,1,n){
cin>>ci;
}
fr(i,1,n-1){
int u,v;
cin>>u>>v;
if(cu=='C'){
if(cv=='S'){
num1u++;
}
}
if(cv=='C'){
if(cu=='S'){
num1v++;
}
}
if(cu=='P'){
if(cv=='C'){
num2u++;
}
}
if(cv=='P'){
if(cu=='C'){
num2v++;
}
}
gu.pb(v);
gv.pb(u);
}
int ans=0;
fr(u,1,n){
int ans1=0;
int ans2=0;
if(cu=='C'){
for(int v:gu){
if(cv=='C'){
ans1+=num1v;
}
if(cv=='P'){
ans2+=(num2v-1);
}
}
}
ans=ans+ans1*ans2;
}
cans;
}
signed main(){
GG;
int _t=1;
cin>>_t;
while(_t--){
solve();
}
}
K
队友敲的
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define endl "\n"
LL mod=998244353;
LL ksm(LL a,LL n){
LL res=1;
while(n){
if(n&1)res=res*a;
a=a*a;
n/=2;
}
return res;
}
vector<LL>fa(1e6),p(1e6),idx(1e6);
LL find(LL x){
if(x!=fax){
fax=find(fax);
}
return fax;
}
void union1(LL x,LL y){
LL a=find(x),b=find(y);
if(idxa>idxb)swap(a,b);
faa=fab;
}
void solve(){
LL n;
cin>>n;
//vector<LL>p(n+1);
for(int i=1;i<=n;i++){
cin>>pi;
idxp\[i]=i;
fai=i;
}
vector<vector<LL>>edag(n+1);
for(int i=1;i<n;i++){
LL u,v;
cin>>u>>v;
edagu.push_back(v);
edagv.push_back(u);
}
vector<LL>ans(n+1);
for(int i=n;i>=1;i--){
LL x=pi;
for(int y:edagx){
if(idxx<idxy){
LL a=find(y);
faa=x;
ansa=x;
}
}
}
for(int i=1;i<=n;i++){
if(ansi==i)cout<<0<<" ";
else cout<<ansi<<" ";
}
cout<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LL T=1;
cin>>T;
while(T--){
solve();
}
}