福建农林
派蒙之灵
自己第一眼没有很好的处理方法,其实是对十转N,N转十,的模板,不熟练
N转十则是用秦九shao,res=res*b+str-'0';
正解:十转N递归反转,此题不需要求N进制形式,只需统计字母圈的个数
开个mp存下状态,直接连续赋值,统计就好
int a[16];
int main()
{
a[0] = a[6] = a[9] = a[13] = 1;
a[8] = a[11] = 2;
int n, sum = 0;
cin >> n;
while (n)
{
sum += a[n % 16];
n /= 16;
}
cout << sum;
return 0;
}
派蒙家的荧女仆
正解:简单模拟,按题意模拟就行
int q[N];
void solved()
{
int n;cin>>n;
int mx=0,cnt=0;
map<int,int> mp;
for(int i=1;i<=n*2;i++)
{
cin>>q[i];
mp[q[i]]++;
cnt++;
if(mp[q[i]]==2)cnt-=2;
mx=max(mx,cnt);
}
printf("%d\n",mx);
;
}
派蒙的奇妙冒险------石之海
涂色,求最小涂色方案
正解:列出多组数据,发现答案只能是1或者2,特判就能过
void solved()
{
int n;cin>>n;
if(n>=3)puts("2");
else puts("1");
派蒙游戏世界对旅行荧妹很不友好
构造,贪心题目,只要输出合理就能过
正解:求i的等差数列前缀和,越过特判,否则有解,此时的迭代器-1就是Sn=a+b,
给出构造从这个迭代器往下枚举(因为解一定是来自某个i),求a的解所以>=a输出,一定可以找到这样一个序列
void solved()
{
int a,b;cin>>a>>b;
int sum=a+b;
int cnt=0;
int i=0;
for( i=1;;i++)
{
cnt+=i;
if(cnt>=sum)break;
}
if(cnt!=sum){puts("NO");return;}
else{
puts("YES");
printf("%d\n",i);
for(int j=i;j>=1;j--)
{
if(a>=j)printf("%d ",j),a-=j;
}
puts("");
}
}
派蒙的风花,从下面看?还是从侧面看?
差分,自己写没考虑数据是查找多个差分值,这个时候就要离散化了。
正解:离散化差分,二分(很神奇)直接枚举l下标和r下标的差值,(upper,lower从英文字面意思理解)
把l,r,q[i]处理区间全加入一个vector排序去重
vector存一下枚举的l,r,用于差分操作
离散化从0往后取点,再对新数组差分,前缀和
int n,m;
int b[N],q[N];
vector<int> v1;
vector<PII> alls;
int find(int x){
int l=0,r=v1.size()-1;
while(l<r){
int mid=l+r>>1;
if(v1[mid]>=x) r=mid;
else l=mid+1;
}
return l;
}
void solved()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
int l,r;
cin>>l>>r;
v1.push_back(l);
v1.push_back(r);
alls.push_back({l,r});
}
for(int i=1;i<=m;i++){
cin>>q[i];
v1.push_back({q[i]});
}
sort(v1.begin(),v1.end());
v1.erase(unique(v1.begin(),v1.end()),v1.end());
for(int i=0;i<alls.size();i++){
int l=find(alls[i].first),r=find(alls[i].second);
b[l]+=1;
b[r+1]-=1;
}
for(int i=0;i<N;i++) b[i]+=b[i-1];
for(int i=1;i<=m;i++){
printf("%d ",b[find(q[i])]);
}
}