#include<bits/stdc++.h>
using namespace std;
/*
公式一。
等差数列求和
Sn=(a1+an)×n/2
Sn=na1+n(n-1)d/2
通项an=a1+(n-1)d
2n+1
1 3 5 7 9
0 1 2 3 4
*/
int n;
char c;
bool check(int x){
int sum=(3*x+x*(x-1))*2+1;
return (n-sum)>=0;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//2分
cin>>n>>c;
if(n<7)return !(cout<<c<<endl<<n-1);
int l=1,r=n+1;
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
int top=l*2+1;
int space=0;
for(int i=top;i>1;i-=2){
cout<<string(space,' ');
cout<<string(i,c)<<endl;
++space;
}
cout<<string(space,' ');
cout<<c<<endl;
--space;
for(int i=3;i<=top;i+=2){
cout<<string(space,' ');
cout<<string(i,c)<<endl;
--space;
}
--top;
cout<<n-((3*l+l*(l-1))*2+1);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
map<char,int>dict;
string s;cin>>s;
for(int i=0;i<s.size();++i){
++dict[s[i]];
}
for(auto& it:dict){
cout<<it.first<<":"<<it.second<<endl;
}
return 0;
}
map,set的本质是异质数组,pair,tuple是单元素
///1
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
tuple<string,int,int>info[n+1];
string a;int b,c;
for(int i=1;i<=n;++i){
cin>>a>>b>>c;
get<0>(info[i])=a;
get<1>(info[i])=b;
get<2>(info[i])=c;
}
int m;cin>>m;
while(m--){
cin>>b;
for(int i=1;i<=n;++i){
if(get<1>(info[i])==b){
cout<<get<0>(info[i])<<" "<<get<2>(info[i])<<endl;
}
}
}
}
/2
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
map<int,pair<string,int>> hx;
string a;int b,c;
for(int i=1;i<=n;++i){
cin>>a>>b>>c;
hx[b]=make_pair(a,c);
//hx.insert(make_pair(b,make_pair(a,c))); 也可
}
int m;cin>>m;
while(m--){
cin>>b;
cout<<hx[b].first<<" "<<hx[b].second<<endl;
}
}
#include<bits/stdc++.h>
using namespace std;
map<int,string>dict{
{0,"ling"},
{1,"yi"},
{2,"er"},
{3, "san"},
{4, "si"},
{5, "wu"},
{6, "liu"},
{7, "qi"},
{8, "ba"},
{9, "jiu"}
};
int main(){
ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
string s;cin>>s;
auto it=s.begin();
if(*s.begin()=='-'){
cout<<"fu ";++it;
}
for(;it<s.end();++it){
cout<<dict[*it-'0']<<" "[it+1==s.end()];
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define li long int
void gcd(li& x,li& y) {
li g=__gcd(x,y);//求最大公因数
x/=g;y/=g;//约分
}
int main() {
int n;cin>>n;
li a,b,x,y;
scanf("%ld/%ld",&a,&b);//a分子,b分母
for (int i=1;i<n;++i) {
scanf("%ld/%ld",&x,&y);
a=a*y+ b*x;
b*=y;
gcd(a,b);
}
if(a%b == 0)cout<<a/b<<endl;
else{
if(a/b)//当分子大于分母
cout<<a/b<<" ";
cout<<a - a/b*b <<"/"<<b<< endl;
}
}
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
int a,b;cin>>a>>b;int sum=0;
for(int i=a,pos=1;i<=b;++i,++pos){
cout<<right<<setw(5)<<i<<"\n"[pos%5!=0];//false执行
sum+=i;
if(i==b&&pos%5!=0)cout<<endl;
}
cout<<"Sum = "<<sum;
return 0;
}
异或交换
#include<bits/stdc++.h>
using namespace std;
void exc(int& a,int& b){
a^=b;
b^=a;
a^=b;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int a,b,c;
cin>>a>>b>>c;
if(a>b)exc(a,b);
if(a>c)exc(a,c);
if(b>c)exc(b,c);
cout<<a<<"->"<<b<<"->"<<c;
}
考察含空格的字符串读取,删除的逻辑
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
getline(cin,s1);//按行读取
getline(cin,s2);
sort(s2.begin(),s2.end());
for(int i=0;i<s1.size();++i){
for(int j=0;j<s2.size();++j){
if(s2[j]>s1[i])break;//剪枝
if(s1[i]==s2[j]){
s1.erase(i,1);
--i;//删除当前,则下一个元素应仍是当前
}
}
}
cout<<s1<<endl;
return 0;
}
自写快速幂,实质pow即可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll fastpow(ll base,ll power,ll mod){
ll ans=1;
base%=mod;
while(power){
if(power&1)ans=ans*base%mod;
base=base*base%mod;
power>>=1;
}
return ans;
}
int main(){
int power;cin>>power;
cout<<"2^"<<power<<" = "<<fastpow(2,power,1025);//最大为1024
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int curjc=1,sum=0;
int main(){
int n;cin>>n;
for(int i=1;i<=n;++i){
curjc*=i;
sum+=curjc;
}
cout<<sum;
return 0;
}
四舍五入
#include<bits/stdc++.h>
using namespace std;
int lop(double n){
int zhengshu=n*10;
if(zhengshu%10>4)return ceil(n);
else return floor(n);
}
int main(){
int n;char c;
cin>>n>>c;
int loop=lop((double)n/2);
// cout<<loop<<endl;
for(int i=1;i<=loop;++i){
for(int j=1;j<=n;++j){
cout<<c;
}
cout<<endl;
}
return 0;
}
键值hash:unordered_map<int,char>
加权求和:Σ(值i×权i)
字符串每一元素是字符
#include<bits/stdc++.h>
using namespace std;
int w[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
unordered_map<int,char>haxi{{0,'1'},{1,'0'},{2,'X'},{3,'9'},{4,'8'},{5,'7'},{6,'6'},{7,'5'},{8,'4'},{9,'3'},{10,'2'}};
vector<string>ans;
string s;
int sum;
bool flag;
int main(){
int n;cin>>n;
vector<string>str(n+1);
for(int i=1;i<=n;++i)cin>>str[i];//读
for(int i=1;i<=n;++i){//处理每一个字符串
sum=0;flag=true;
for(int j=0;j<17;++j){
if(!isdigit(str[i][j])){
ans.push_back(str[i]);
flag=false;
break;
}
sum+=((str[i][j]-'0')*w[j]);
}
// cout<<str[i][17]<<" "<<haxi[sum%11]<<" "<<sum%11<<endl;
if(haxi[sum%11]!=str[i][17]&&flag)ans.push_back(str[i]);
}
if(!ans.empty()){
for(string& s:ans)cout<<s<<endl;
}else cout<<"All passed";
return 0;
}
/*
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
*/
天梯赛喜欢考一些,处理某个位以后(for的i),消除产生差位,或者基于其他原则产生进位
(double)int/int
ll不足50位
奇数偶数判断直接看最后一位%2
#include<bits/stdc++.h>
using namespace std;
#define ll long long
string nums;
int pos;
int er;
int weishu;
double ans=1;
int main(){
ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
cin>>nums;
weishu=nums.size();
if(nums[0]=='-'){
pos=1;
--weishu;
ans*=1.5;
}
if((nums.back()-'0')%2==0)ans*=2;
for(;pos<nums.size();++pos)if(nums[pos]=='2')++er;
ans*=(double)er/weishu;
cout<<fixed<<setprecision(2)<<ans*100<<"%";
//-13142223336
return 0;
}
#include<bits/stdc++.h>
using namespace std;
vector<int>path;
struct node{
int data;
node* lson,* rson;
// node(int w){data=w;lson=rson=nullptr;}
node(int x):data(x),lson(nullptr),rson(nullptr){}
};
node* ins(node* root,int val){
if(root==nullptr)root=new node(val);
else if(val<root->data)root->lson=ins(root->lson,val);
else if(val>=root->data)root->rson=ins(root->rson,val);
return root;
}
void pretra(node* root){
if(root==nullptr)return;
cout<<root->data<<" ";
pretra(root->lson);
pretra(root->rson);
}
void intra(node* root){
if(root==nullptr)return;
intra(root->lson);
// cout<<root->data<<" ";
path.push_back(root->data);
intra(root->rson);
}
void latra(node* root){
if(!root)return;
latra(root->lson);
latra(root->rson);
// cout<<root->data<<" ";
path.push_back(root->data);
}
node* rvs(node* root){
if(!root)return nullptr;
swap(root->lson,root->rson);
rvs(root->lson);
rvs(root->rson);
return root;
}
int maxH(node* root){
if(!root)return 0;
int lH=maxH(root->lson);
int rH=maxH(root->rson);
if(!root->lson&&root->rson)return 1+rH;
if(root->lson&&root->lson)return 1+lH;
return 1+max(lH,rH);
}
int minH(node* root){
if(!root)return 0;
int lH=minH(root->lson);
int rH=minH(root->rson);
if(!root->lson&&root->rson)return 1+rH;
if(root->lson&&root->lson)return 1+lH;
return 1+min(lH,rH);
}
int main(){
int n;cin>>n;
queue<int>ele;int temp;
int rt;cin>>rt;
node* root=new node(rt);
for(int i=0;i<n-1;++i){cin>>temp;ele.push(temp);}
while(!ele.empty()){
ins(root,ele.front());ele.pop();
}
if(abs(maxH(root)-minH(root))>1){
cout<<"@";
rvs(root);
if(abs(maxH(root)-minH(root))>1){
cout<<"NO";
}
else{
cout<<"()";
latra(root);
for(int& x:path)cout<<x<<" ";
}
}else{
cout<<"!";
latra(root);
for(int& x:path)cout<<x<<" ";
}
// intra(root);
// if(is_sorted(path.begin(),path.end())){
// cout<<"YES"<<endl;
// path.clear();
// latra(root);
// for(int& x:path)cout<<x<<" ";
// }else{
// cout<<"@"<<endl;
// rvs(root);
// path.clear();
// intra(root);
// if(is_sorted(path.begin(),path.end())){
// cout<<"YES"<<endl;
// rvs(root);
// path.clear();
// latra(root);
// for(int& x:path)cout<<x<<" ";
// }else{
// cout<<"NO";
// }
//
// }
}
/*
7
8 6 5 7 10 8 11
*/
#include<bits/stdc++.h>
using namespace std;
vector<int>seq;//原树前序
vector<int>preseq;//搜索树前序
vector<int>lastseq;//镜像搜索树前序
vector<int>preseqM;//搜索树后序
vector<int>lastseqM;//镜像搜索树后序
//其实深搜容器一个就行,判断不是则clear再换序读入
struct node{
int data;
node* lson,*rson;
// node(int a){data=a;lson=nullptr;rson=nullptr;}//都可
node(int a):data(a),lson(0),rson(0){}
};
node* ins(node*& root,int val){//以根结点指针引用*&建立搜索二叉树,若为空树则建树返回根,不为空则按照规则插入
if(!root){
root=new node(val);
return root;
}
if(val<root->data)ins(root->lson,val);
if(val>=root->data)ins(root->rson,val);
return root;//记得return,不返回则pta段错误
}
/*建立二叉搜索树的镜像反转
//还有解法是读取时建立两棵树
void insertM(node *&root,int val){
if(!root){
root=new node(val);
return root;
}
if (data > root->data)insertM(root->left, data);
else insertM(root->right, data);
return root;
}
*/
//几个深搜遍历
void pretra(node* root){
if(!root)return;
preseq.push_back(root->data);
pretra(root->lson);
pretra(root->rson);
}
void pretraM(node* root){
if(root==nullptr)return;
preseqM.push_back(root->data);
pretraM(root->rson);
pretraM(root->lson);
}
void lasttra(node* root){
if(root==nullptr)return;
lasttra(root->lson);
lasttra(root->rson);
lastseq.push_back(root->data);
}
void lasttraM(node* root){
if(root==nullptr)return;
lasttraM(root->rson);
lasttraM(root->lson);
lastseqM.push_back(root->data);
}
int main(){
ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
int n,temp;cin>>n;
node* root=nullptr;
for(int i=0;i<n;++i){
cin>>temp;
seq.push_back(temp);
ins(root,temp);//读取顺便建树
}
pretra(root);
pretraM(root);
if(preseq==seq){
cout<<"YES"<<endl;
lasttra(root);
for(auto i=lastseq.begin();i<lastseq.end();++i){
cout<<*i;
if(i<lastseq.end()-1)cout<<" ";
}
}else {
if(preseqM==seq){
cout<<"YES"<<endl;
lasttraM(root);
for(auto i=lastseqM.begin();i<lastseqM.end();++i){
cout<<*i<<" "[i + 1 == lastseqM.end()];//若表达式为true则不执行
//如果不想最后一个元素末尾输出该输出位的东西,用布尔数组里面嵌套表达式
}
}else{
cout<<"NO";
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define VI vector<int>
#define VVI vector<vector<int>>
int n,m;
long long bao,dao;
bool isd=false,isb=false;//岛,宝
//我tom的还以为斜线也算弄了好久
//int dirx[9]{0,-1,-1,-1,0,0,1,1,1};
//int diry[9]{0,-1,0,1,-1,1,-1,0,1};
int dirx[5]{0,-1,0,0,1};
int diry[5]{0,0,-1,1,0};
//这个题比较鞥新,因为不可以预定义地图大小,nm是不定量,但都开1e5要爆
//vector二维数组好传一些
void inline dfs(const int& sx,const int& sy,VVI &arr,VVI &vis){
if(!arr[sx][sy])return;
vis[sx][sy]=true;//已经访问
if(arr[sx][sy]==1)isd=true;
if(arr[sx][sy]>1)isd=isb=true;
for(int i=1;i<=4;++i){
int adjx=sx+dirx[i],adjy=sy+diry[i];
if(adjx>n||adjx<1||adjy>m||adjy<1)continue;
if(vis[adjx][adjy])continue;
if(arr[adjx][adjy])dfs(adjx,adjy,arr,vis);
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
if(n==1&&m==1){
cin>>n;
if(n>1)cout<<1<<" "<<1;
else if(n==1)cout<<1<<" "<<0;
else cout<<0<<" "<<0;
return 0;
}
VVI arr(n+10,VI(m+10,0));
VVI vis(n+10,VI(m+10,false));
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){char temp;cin>>temp;arr[i][j]=temp-'0';}
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
if(!vis[i][j]){
isb=false;isd=false;//重置
dfs(i,j,arr,vis);
if(isd)++dao;
if(isb)++bao;
}
}
cout<<dao<<" "<<bao;
return 0;
}
20分做法
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=520;
int n,m,v1,v2,len,tim,start,tar;
bool flag;
struct node{
int id;ll cost_len,cost_time;
node(int a,ll b,ll c){id=a;cost_time=b;cost_len=c;}
node(int a,ll b){id=a;cost_time=b;}
bool operator < (const node& cur) const {return cur.cost_time<cost_time;};
};
struct edge{
int to;ll wlen,wtime;
edge(int a,ll b,ll c){to=a;wtime=b;wlen=c;}
};
vector<edge>adj[N];
int dis[N];
priority_queue<node>wait;
bool ismin[N];
int pre[N];
void dj(){
while(!wait.empty()){
node cur=wait.top();wait.pop();
if(ismin[cur.id])continue;
ismin[cur.id]=true;
for(auto e:adj[cur.id]){
if(ismin[e.to])continue;
// cout<<cur.id<<" "<<dis[e.to]<<" "<<e.to<<" "<<e.wtime<<" "<<cur.cost_time<<endl;
if(dis[e.to]>e.wtime+cur.cost_time){
dis[e.to]=e.wtime+cur.cost_time;
// cout<<"@"<<e.wtime<<" "<<cur.cost_time<<endl;
wait.push(node(e.to,dis[e.to]));
pre[e.to]=cur.id;
}
}
}
}
vector<int>path1;
vector<int>path2;
void print_path1(int start,int end){
if(start!=end)print_path1(start,pre[end]);
path1.push_back(end);
return;
}
void print_path2(int start,int end){
if(start!=end)print_path2(start,pre[end]);
path2.push_back(end);
return;
}
bool check(){
if(path1.size()!=path2.size())return false;
for(int i=0;i<path1.size();++i){
if(path1[i]!=path2[i])return false;
}
return true;
}
int main(){
memset(dis,0x7f,sizeof(dis));
memset(ismin,false,sizeof(ismin));
memset(pre,0x7f,sizeof(pre));
path1.clear();
cin>>n>>m;
for(int i=1;i<=m;++i){
cin>>v1>>v2>>flag>>len>>tim;
adj[v1].push_back(edge(v2,tim,len));
if(!flag)adj[v2].push_back(edge(v1,tim,len));
}
cin>>start>>tar;
dis[start]=0;wait.push(node(start,0));
dj();
int ans1=dis[tar];
// cout<<"Time = "<<ans1<<": ";
print_path1(start,tar);
// for(int i=0;i<path1.size();++i)cout<<path1[i];
// cout<<endl;
path2.clear();
memset(dis,0x7f,sizeof(dis));
memset(ismin,false,sizeof(ismin));
memset(pre,0x7f,sizeof(pre));
while(!wait.empty())wait.pop();
for(int i=0;i<n;++i)for(auto& e:adj[i])e.wtime=e.wlen;
dis[start]=0;wait.push(node(start,0));
dj();
int ans2=dis[tar];
// cout<<"Distance = "<<ans2<<": ";
print_path2(start,tar);
// for(int i=0;i<path2.size();++i)cout<<path2[i];
if(check()){
cout<<"Time = "<<ans1<<"; Distance = "<<ans2<<": ";
for(int i=0;i<path1.size();++i){
cout<<path1[i];
if(i!=path1.size()-1)cout<<" => ";
}
}else{
cout<<"Time = "<<ans1<<": ";
for(int i=0;i<path1.size();++i){
cout<<path1[i];
if(i!=path1.size()-1)cout<<" => ";
}
cout<<endl;
cout<<"Distance = "<<ans2<<": ";
for(int i=0;i<path2.size();++i){
cout<<path2[i];
if(i!=path2.size()-1)cout<<" => ";
}
}
cout<<endl;
}
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 510;
struct edge{
int to;ll w;
edge(int a,ll b):to(a),w(b){}
};
vector<edge>adj[N];
vector<int>rs(N,0);
int n,m,start,tar,pathlen,minpaths;
vector<bool>vis(N,false);
vector<int>path;
vector<vector<int>>ans;
void inline dfs(int start){
if(start==tar){
path.push_back(pathlen);
ans.push_back(path);
path.pop_back();
return;
}
for(const edge& e:adj[start]){
if(vis[e.to])continue;
path.push_back(e.to);
pathlen+=e.w;
vis[e.to]=true;
dfs(e.to);
path.pop_back();
pathlen-=e.w;
vis[e.to]=false;
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>start>>tar;//点数,边数,起点城市,终点城市
for(int i=0;i<n;++i)cin>>rs[i];
for(int i=0;i<m;++i){
int v1,v2,w;
cin>>v1>>v2>>w;
adj[v1].push_back(edge(v2,w));
adj[v2].push_back(edge(v1,w));
}
path.push_back(start);
vis[start]=true;
dfs(start);
// cout<<"通路有:\n";
// for(auto e:ans){
// for(int x:e){
// cout<<x<<" ";
// }
// cout<<endl;
// }
int minn=INT_MAX;
int maxn=INT_MIN;
for(auto it=ans.begin();it<ans.end();++it){
if(it->back()<minn)minn=it->back();
}
int pos=0,anspos;
for(auto it=ans.begin();it<ans.end();++it){
if(it->back()==minn){
minpaths++;
int sum=0;
for(auto itt=it->begin();itt<it->end()-1;++itt){
sum+=rs[*itt];
}
if(sum>maxn){
maxn=sum;
anspos=pos;
}
}
++pos;
}
cout<<minpaths<<" "<<maxn<<endl;
// cout<<" "<<anspos;
for(auto it=ans[anspos].begin();it<ans[anspos].end()-1;++it){
cout<<*it<<" "[it+1!=ans[anspos].end()-1];
}
return 0;
}
/*
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
*/