前缀和&差分
前言吐槽:
单子里第一题是一个数学题,第二个是dp(还被杀烂了233
我的前缀和&差分呢?
地毯
出现了!二维前缀和&拆分
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int mod=10007;
int n,m;
int x,y,x2,y2;
int mp[1010][1010];
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>x2>>y2;
mp[x][y]++;
mp[x][y2+1]--;
mp[x2+1][y]--;
mp[x2+1][y2+1]++;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
mp[i][j]+=mp[i-1][j]+mp[i][j-1]-mp[i-1][j-1];
cout<<mp[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
/*
二维前缀和&差分
*/
最基础的东西了,最后贴个很妙的讲解的链接
海底高铁
详看solution
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
const int mod=10007;
int n,m;
int pre[N];
signed main()
{
cin>>n>>m;
int last,next;
cin>>last;
for(int i=2;i<=m;i++)
{
cin>>next;
if(last<next)
{
pre[last]++;
pre[next]--; // 错点1 差分数组 到达这座城市并不经过该段路
}
else
{
pre[next]++;
pre[last]--;
}
last=next;
}
int sum=0,ans=0;
for(int i=1;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
sum+=pre[i];
if(sum!=0)ans+=min(a*sum,c+b*sum); // 错点3 认真读题啊喂
}
if(m<=1) ans=0; // 错点2 特殊情况
cout<<ans<<endl;
return 0;
}
/*
直接前缀和 太过麻烦(感觉也写不出来,能写,读错题了,但是估计会t)
正解:先求每一段的路过次数 在贪心选取方案
*/