看題請戳我!
t1 一道很水的貪心。(然而蒟蒻博主一如既往地沒a)
維護乙個小根堆,考慮在每次插入元素時:
1.若新元素比堆頂小,說明在此時**必然比在堆頂時**更優,因此把新元素直接插入堆中。
2.若新元素比堆頂大,說明在此時賣出必然能獲得收益,因此將收益累計入答案中,再把堆頂刪除。
同時還要把新元素兩次插入堆中。
原因:在最優解中,此元素可能並非作為「賣出」的一部分,而是作為「未進行操作」的一部分。插
入一次可以使此元素從「賣出」狀態反悔到「未進行操作」狀態。同樣,再次插入可以使此元
素從「未進行操作」狀態反悔到「**」狀態,從而保證了所有情況均被考慮。
#include//stl通用演算法
#include//
stl位集容器
#include#include
#include
#include
#include
#include
#include
#include
//stl雙端佇列容器
#include//
stl線性列表容器
#include//
stl對映容器
#include#include
//stl佇列容器
#include//
stl集合容器
#include//
stl堆疊容器
#include//
stl通用模板類
#include//
stl動態陣列容器
#define inf 0x3f3f3f3f
#define ll long long
using
namespace
std;
ll n,ans;
priority_queue
,greater>que;
signed main()
printf(
"%lld\n
",ans);
return0;
}
t2 一道第一眼看不出正確演算法的題。
看一眼資料範圍,n<=10^5。顯然o(nlogn)(嗎?)
推一推式子,發現並沒有o(nlogn)的式子出現。
emmm...算了,還是打部分分吧。
看一眼部分分,嗯,前4個點暴力o(n^2)就能水過去。
等下...這中間6個點是怎麼回事?n全部相等?m全部相等?
瞬間茅塞頓開——莫隊。
這告訴我們要多關心部分分中的條件,也許正解就藏在其中。
沒什麼好說的,計算式也很好推,唯一要注意的就是要把所有除法替換成乘逆元。
#include//stl通用演算法
#include//
stl位集容器
#include#include
#include
#include
#include
#include
#include
#include
//stl雙端佇列容器
#include//
stl線性列表容器
#include//
stl對映容器
#include#include
//stl佇列容器
#include//
stl集合容器
#include//
stl堆疊容器
#include//
stl通用模板類
#include//
stl動態陣列容器
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
using
namespace
std;
ll t,q,n,m,siz,fac[
100001],inv[100001],blk[100001],ans[100001
];struct
uioqry[
100001
];ll qpow(ll x,ll y)
return
tmp;
}ll c(
int x,int
y)bool cmp(uio x,uio y)
void
init()
signed main()
for(ll i=1;i<=q;i++) printf("
%lld\n
",ans[i]);
return0;
}
t3 一道喪心病狂的題目...
對於第一種查詢,只需求出每行樓盤個數的字首和即可。可以開2個sum陣列分別表示"行字首和"和"列差分"。
對於第二種查詢,用並查集維護。可以開n個行vector和m個列vector,在插入完成後對每個vector統計。
具體操作步驟
請檢視**注釋。
#include//stl通用演算法
#include//
stl位集容器
#include#include
#include
#include
#include
#include
#include
#include
//stl雙端佇列容器
#include//
stl線性列表容器
#include//
stl對映容器
#include#include
//stl佇列容器
#include//
stl集合容器
#include//
stl堆疊容器
#include//
stl通用模板類
#include//
stl動態陣列容器
#define inf 0x3f3f3f3f
#define ll long long
using
namespace
std;
typedef pair
pr;int id,n,m,k,q,sum1[100002],sum2[100002
];int lnsum=0,mgsum,fa[100002
];int ans1[100002],ans2[100002
];struct
uioprg[
100002
];struct
oiu};
vector
row[100002],col[100002
];vector
dsu[100002
];int find(int x)
void merge(int x,int
y)int
main()
; oiu lenx=,leny=;
row[lx].push_back(leny);
col[ly].push_back(lenx);
if(lx==rx) sum1[lx]+=(ry-ly+1);//
行數量
else sum2[lx]++,sum2[rx+1]--;//
列差分
}
for(int i=1;i<=n;i++) sort(row[i].begin(),row[i].end());
for(int i=1;i<=m;i++) sort(col[i].begin(),col[i].end());
for(int i=1;i<=k;i++)
;//第i條的右邊
int tmp=upper_bound(row[dwn].begin(),row[dwn].end(),range)
-row[dwn].begin()-1;//
l<=ry的第一條
for(;tmp>=0&&row[dwn][tmp].r>=prg[i].ly;tmp--)//
r>=ly
dsu[dwn].push_back(make_pair(i,row[dwn][tmp].id));//
在dwn行連線
}
int rgt=prg[i].ry+1;//
第i條的右邊一列
if(rgt<=m&&col[rgt].size())//
第i條的右邊一列作為某些條的左邊界
;//第i條的下面
int tmp=upper_bound(col[rgt].begin(),col[rgt].end(),range)
-col[rgt].begin()-1;//
l<=rx的第一條
for(;tmp>=0&&col[rgt][tmp].r>=prg[i].lx;tmp--)//
r>=lx
dsu[max(prg[i].lx,prg[col[rgt][tmp].id].lx)].push_back(make_pair(i,col[rgt][tmp].id));
//在 第i條的上邊界 與 該條的上邊界 的靠下者 連線
} }
for(int i=1;i<=n;i++) sum2[i]+=sum2[i-1];//
差分->數量
for(int i=1;i<=n;i++) sum2[i]+=sum2[i-1],//
數量->字首和
sum1[i]+=sum1[i-1],//
數量->字首和
ans1[i]=sum1[i]+sum2[i];//
第一種查詢
for(int i=1;i<=k;i++) fa[i]=i;
for(int i=1;i<=n;i++)
for(int i=1;i<=q;i++)
return0;
}
2017 9 7 模擬考試
問題描述 一張長度為 的紙帶,我們可以從左至右編號為0 紙帶最左端標號為 0 現在有 次操作,每次將紙帶沿著某個位置進行摺疊,問所有操作之後紙帶 的長度是多少。輸入格式 第一行兩個數字 如題意所述。接下來一行 個整數代表每次摺疊的位置。輸出格式 一行乙個整數代表答案。樣例輸入 5 2 3 5 樣例輸...
RHSCA模擬考試
開始考試 桌面是個黑框子 點選reboot按鈕,破解密碼 開機成功,輸入startx進入圖形介面 不能複製,要在物理機用ssh root 172.25.0.11 遠端連線,就可以複製貼上了 hostname server.reorigion5.example.com 四級網域名稱 有問題 10.配置...
2018 7 20模擬考試
這次的題.很水.然而還是差點爆零 t1 題目簡述 給定乙個序列,求區間最大子段和 帶修改操作 n 500000,m 100000 解題思路 線段樹維護即可。gss3原題.資料範圍都不變.出題人好懶 include include include include include include def...