前言
无心路历程
一、题目分析
A 按位异或
a、b同位对应 1 0 or 0 1,x无影响;0 0 x=0;1 1 x=1;等同于a b 位异或;
故本题只需a^b;(so!为什么提醒第一组数据x=4!!!)
B 读题读懂
题意 (1,1)走到(n,n),n*n的格子为0或1;选定0或1后只能走选定的数字对应格子,有两次修改机会,如何修改让它一定走不出去?
题解 起点、终点各相邻两个格子,使两个格子相同&起终点的相邻对应不同,eg0011,1100.
C 思维+找规律
题意:对一串字符操作(从第二个到倒数第二个字符操作),使其变成回文字符串。R使字符翻转到后面,L翻转到前面。
例如:abcd;R3(n-1)->abcdc L234(2~n-1=n)->dcbabcdc L2->cdcbabcdc;
规律 R->n-1 L->n L2;
D (耐心+脑子)
signed main()
{
int t;
cin >> t;
while(t--) {
int y, x;
cin >> y >> x;
int c1,c2,c3,c4,c5,c6;
cin >> c1 >> c2 >> c3 >> c4 >> c5 >> c6;
c1 = min (c1, c2 + c6);
c2 = min (c2, c1 + c3);
c3 = min (c3, c2 + c4);
c4 = min (c4, c3 + c5);
c5 = min (c5, c4 + c6);
c6 = min (c6, c1 + c5);
int sum =0;
if (y >= 0 && x >= 0) {
sum += min(y, x) * c1 + (y - min(y, x)) * c6 + (x - min(y, x)) * c2;
}
else if (y >= 0 && x < 0) {
sum += y * c6 + x * (-c5);
}
else if (y <= 0 && x > 0) {
sum += y * c3 + x * (-c2);
}
else {
sum += max(y, x) * (-c4) + (max(y, x) - y) * c3 + (max(y, x) - x) * c5;
}
ll ss;
ss = abs(sum);
cout << ss << '\n';
}
return 0;
}
signed?待研究
E 单调栈+二分
hdu5033
poj3250 2559 3494
F字典序yes
G 线段覆盖+差分
#include <cstdio>
#include <iostream>
#include <algorithm>
#include<map>
using namespace std;
typedef long long ll;
map<ll,int> zz;
ll ans[200010];
int main(){
ll n;
cin>>n;
for(int i=1;i<=n;i++){
ll l,r;
cin>>l>>r;
zz[l]++;//l+1,r+1处-1,即差分对应区间+1;
zz[r+1]--;
}
map<ll,int>::iterator it;
it=zz.begin();
ll a=it->first;
ll b=it->second;
it++;
for(;it!=zz.end();it++){
ans[b]+=it->first-a;
a=it->first;
b+=it->second;
}
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
return 0;
}
eg map b
3 zz 1 a[1]+=1=1;
0 3 0 1 2 a[2]+=3-1=2;
1 3 >>> 1 1 >>> 3 a[3]+=4-3=1; >>> 6 2 1
3 8 3 1 1 a[1]+=9-4=6;
4 -2
9 1
H 前缀yes
I 拓扑排序
究竟错哪了! ! !(再看看 再看看 忍住!)
J最短路径
捂脸 果然拖延症难治
K 差分基础yes
L
M 质因数分解
求每个数质因子,最小质因子排序,最小的两个乘积(不能用set,不能去重)
for (ll j = 2; j <= sqrt(a[i]); j++){
while (a[i] % j == 0){
a[i] /= j;
zz.push_back(j);
}
}//复习
二、知识积累
1.单调栈
2.拓扑排序
小结
读不懂题目 枯辽 严重怀疑自己的英语理解
基础知识 差好多
记得把剩下的题补了!